ເງິນເດືອນສະເລ່ຍບໍ່ລວມວິທີແກ້ໄຂບັນຫາເງິນເດືອນຂັ້ນຕໍ່າແລະສູງສຸດ


ລະດັບຄວາມຫຍຸ້ງຍາກ Easy
ຖາມເລື້ອຍໆໃນ NetSuite
LeetCode

ບັນຫາບັນຫາ

ໃນບັນຫາ” ສະເລ່ຍ ເງິນເດືອນບໍ່ລວມເງິນເດືອນຂັ້ນຕ່ ຳ ແລະສູງສຸດ” ພວກເຮົາໄດ້ຮັບເງິນເດືອນ. ບ່ອນທີ່ແຕ່ລະອົງປະກອບໃນແຖວເປັນຕົວແທນໃຫ້ເງິນເດືອນຂອງພະນັກງານທີ່ແຕກຕ່າງກັນ. ແຕ່ລະຄ່າໃນແຖວມີເອກະລັກສະເພາະ.

ວຽກງານຂອງພວກເຮົາແມ່ນຄິດໄລ່ເງິນເດືອນສະເລ່ຍຂອງພະນັກງານທີ່ບໍ່ລວມເອົາເງິນເດືອນຂັ້ນຕ່ ຳ ແລະສູງສຸດ.

ຍົກຕົວຢ່າງ

Salary= [8000,9000,2000,3000,6000,1000]
4750.0

ຄໍາອະທິບາຍ:

ເງິນເດືອນສະເລ່ຍບໍ່ລວມວິທີແກ້ໄຂບັນຫາເງິນເດືອນຂັ້ນຕໍ່າແລະສູງສຸດ

ໃນບັນຊີເງິນເດືອນທີ່ໃຫ້ໄວ້ 9000 ແມ່ນເງິນເດືອນສູງສຸດແລະ 1000 ແມ່ນເງິນເດືອນຕໍ່າສຸດ. ດັ່ງທີ່ພວກເຮົາຕ້ອງການຊອກຫາເງິນເດືອນສະເລ່ຍບໍ່ລວມ ຕໍາ່ສຸດທີ່ແລະສູງສຸດ ເງິນເດືອນດັ່ງນັ້ນພວກເຮົາຈະບໍ່ເພີ່ມຄ່ານິຍົມເຫລົ່ານີ້ເຂົ້າໃນ ຈຳ ນວນທັງ ໝົດ. ຜົນລວມແມ່ນ 19000 ສະນັ້ນຄ່າສະເລ່ຍແມ່ນ 19000/4 ນັ້ນແມ່ນ 4750.

ວິທີການ

ນີ້ແມ່ນປັນຫາພື້ນຖານດ້ານຄະນິດສາດ. ວຽກງານຂອງພວກເຮົາແມ່ນເພື່ອຊອກຫາເງິນເດືອນຂັ້ນຕ່ ຳ ແລະເງິນເດືອນສູງສຸດຈາກນັ້ນຊອກຫາສະເລ່ຍຂອງເງິນເດືອນທີ່ເຫລືອ ພວກເຮົາຈະປະຕິບັດຕາມຂັ້ນຕອນເຫຼົ່ານີ້:

  1. ເລີ່ມຕົ້ນເງິນເດືອນຕ່ ຳ ສຸດກັບ INT_MAX, ເງິນເດືອນສູງສຸດກັບ INT_MIN. ພວກເຮົາຈະໃຊ້ຕົວແປເພື່ອເກັບເງີນເດືອນດັ່ງນັ້ນເລີ່ມຕົ້ນດ້ວຍ 0.
  2. ລອກແຖວຂອງອາເລແລະເພີ່ມເງິນເດືອນແຕ່ລະເຂົ້າໃນຍອດລວມ. ພ້ອມດຽວກັນນີ້, ຍັງປັບປຸງມູນຄ່າຂອງເງິນເດືອນຂັ້ນຕໍ່າແລະເງິນເດືອນສູງສຸດ.
  3. ຖ້າວ່າມູນຄ່າຂອງ n ແມ່ນນ້ອຍກວ່າສາມ, ຫຼັງຈາກນັ້ນ, ເງິນເດືອນສະເລ່ຍຈະເປັນອີກ 2 ເງິນເດືອນສະເລ່ຍຈະເປັນ (ເງິນເດືອນທັງ ໝົດ - ເງິນເດືອນຂັ້ນຕ່ ຳ ສຸດ - ເງິນເດືອນສູງສຸດ) / (n-XNUMX).
  4. ພວກເຮົາຈະຄູນ (n-2) ກັບ 1.0 ເພາະວ່າເງິນເດືອນສະເລ່ຍອາດຈະເປັນມູນຄ່າສອງເທົ່າ.

ລະຫັດ ສຳ ລັບເງິນເດືອນສະເລ່ຍບໍ່ລວມວິທີແກ້ໄຂບັນຫາເງິນເດືອນຂັ້ນຕໍ່າແລະສູງສຸດ

ລະຫັດ C ++

#include <bits/stdc++.h> 
using namespace std; 
       double average(vector<int>& salary) {
        int n=salary.size();
        int mn=INT_MAX,mx=INT_MIN,sum=0;
        for(int i=0;i<n;i++)
        {
            sum=sum+salary[i];
            mn=min(mn,salary[i]);
            mx=max(mx,salary[i]);
        }
        double ans=(sum-mn-mx)/((n-2)*1.0);
        if(n>2)
            return ans;
        else 
            return 0;
    }
int main() 
{ 
 vector<int> arr = {8000,9000,2000,3000,6000,1000}; 
 cout<<average(arr)<<endl; 
 return 0;
}
4750.0

ລະຫັດ Java

import java.util.Arrays; 
public class Tutorialcup {
        public static double average(int[] salary) {
        int n=salary.length;
        int mn=Integer.MAX_VALUE,mx=Integer.MIN_VALUE,sum=0;
        for(int i=0;i<n;i++)
        {
            sum=sum+salary[i];
            mn=Math.min(mn,salary[i]);
            mx=Math.max(mx,salary[i]);
        }
        double ans=(sum-mn-mx)/((n-2)*1.0);
        if(n>2)
            return ans;
        else 
            return 0;
    }
  public static void main(String[] args) {
    int [] arr = {8000,9000,2000,3000,6000,1000}; 
    double ans=  average(arr);
    System.out.println(ans);
  }
}
4750.0

ການວິເຄາະຄວາມສັບສົນຂອງເງິນເດືອນສະເລ່ຍບໍ່ລວມວິທີແກ້ໄຂບັນຫາເງິນເດືອນຂັ້ນຕໍ່າແລະສູງສຸດ

ຄວາມສັບສົນເວລາ

ຄວາມສັບສົນຂອງເວລາຂອງລະຫັດຂ້າງເທິງແມ່ນ O (n) ເພາະວ່າພວກເຮົາ ກຳ ລັງຂຸ້ນຂ້ຽວຈັດຫາເງິນເດືອນພຽງແຕ່ຄັ້ງດຽວ. ນີ້ແມ່ນຄວາມຍາວຂອງແຖວຂອງເງິນເດືອນ.

ຄວາມສັບສົນໃນອະວະກາດ

ຄວາມສັບສົນໃນພື້ນທີ່ຂອງລະຫັດຂ້າງເທິງແມ່ນ O (1) ເພາະວ່າພວກເຮົາ ກຳ ລັງໃຊ້ຕົວແປເພື່ອເກັບ ຄຳ ຕອບ.

ເອກະສານ