算法面试之一道去除数组里重复数字的算法题

  • 题目描述: 给定一个整形数组,例如:21,23,25,15,15,23,98,5,21  去除重复项之后保留的数组为25,98,5.
  • java语言解法:
    public class ArrayViewUtils {
    
        /**
         * @desc  删除数组里重复的数字,只保留不重复的数字。
         * 时间复杂度分析为O(n)
         * @param arr 数组
         * @return arr[]
         */
        public static int[] delRepeatFromArray(int[] arr) {
            if(null==arr){
                return null;
            }
            int length = arr.length;
            if(length<1){
                return null;
            }
                //统计重复出现数字的总个数
            int repeatSum=0;
            HashMap<Integer, Integer> map = new HashMap<>(length,1.0F);
            for (int i = 0; i <length ; i++) {
                    //存在重复则value大于1不存在重复 value 等于1
                if(map.containsKey(Integer.valueOf(arr[i]))){
                    map.put(arr[i],map.get(arr[i])+1);
                    if(map.get(arr[i])==2){
                        repeatSum=repeatSum+1;
                    }
                    repeatSum=repeatSum+1;
                }else{
                    map.put(arr[i],1);
                }
            }
            int[] resultArr=new int[length-repeatSum];
            int m=0;
            for (int i = 0; i <length ; i++) {
                if(map.get(arr[i])==1){
                    resultArr[m]=arr[i];
                    m++;
                }
            }
            return resultArr;
        }
      public static void main(String[] args) {
            int[] arr1={1,22,58,1,69,55,11,11,58,2,3,5,2,99};
            int[] resultArr1 = ArrayViewUtils.delRepeatFromArray(arr1);
            for (int i = 0,len=resultArr1.length; i <len ; i++) {
                System.out.println(resultArr1[i]+"  ,");
            }
        }
    }

     

  • 利用hashMap 的特性,一次循环,key则是数组里的数字,value记录数组里的数字出现的次数,大于1则重复出现。
  • 再一次循环数组,把不重复的数字记录到新的数组里。
  • 这里可以分析到时间复杂度为O(n),空间复杂度 新建里数组和map,复杂度也为O(n).
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章