zoukankan      html  css  js  c++  java
  • 一个整型有序数组,数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字

    一、方法一

         (1)运用hashMap的方法

    /*
    解法2:
    (1)思路:这个可以可以使用一个Map,Map对应的键值key就是数组中的元素,value就是这个元素出现的次数。这样我
    通过一次遍历数组中的元素,如果元素出现在map中,则将其对应的value加1,否则将元素添加到map中,这样遍历一遍数组,我们就可以得到数组中每个元素对应出现的次数,然后再通过遍历一遍map,返回value为1对应的key就是我们需要求得元素。
    (2)时间复杂度:因为首先需要遍历一遍数组,时间开销为O(n),构建完map后需要遍历一遍map找到value为1的元素,而map的个数为n/2,时间开销为O(n/2),所以总的时间开销为O(n)。
    (3)空间复杂度:因为需要建立一个map,而且最后map的大小为n/2,所以空间复杂度为O(n)。
    */
        public static void findNumsAppearOnce1(int[] arr) {
            //Map对应的键值key就是数组中的元素,value就是这个元素出现的次数
            Map<Integer, Integer> hashMap = new HashMap<Integer, Integer>();
            for (int i : arr) {
                if (hashMap.containsKey(i)) {
                    hashMap.put(i, hashMap.get(i) + 1); //如果存在,value值加1
                } else {
                    hashMap.put(i, 1); //如果不存在,存入hashMap,value值等于1
                }
            }
    
            //遍历一遍map,返回value为1对应的key就是我们需要求得元素
            Set<Integer> set = hashMap.keySet();
            for (int i : set) {
                if (hashMap.get(i) == 1) {
                    System.out.print(i+" ");
                }
            }
        }
    View Code

          (2)时间复杂度:O(n)

    二、方法二

          (1)运用异或运算符的方法

    public static void findNumAppearOnce(int[] arr) {
            int result = 0;
            for (int i = 0; i < arr.length; i++) {
                result ^= arr[i];
            }
            System.out.println(result);
    View Code

          (2)时间复杂度:O(n)

    三、方法三

         (1)二分查找法

     public static int method(int[] arr) {
    
            int start = 0; //定义变量,记录最小的索引
            int end = arr.length - 1; //定义变量,记录最大的索引
            int mid = (start + end) / 2; //定义变量,记录中间的索引
    
            while ((arr[mid] == arr[mid - 1]) || (arr[mid] == arr[mid + 1])) {
                if ((arr[mid] != arr[mid - 1]) && (arr[mid] != arr[mid + 1])) {//与两边的数不等,break
                    break;
                } else if (arr[mid] == arr[mid + 1]) {  //中间值与右边的值相等
                    if ((arr.length - 1 - mid + 1) % 2 == 0) { //加上mid对应的数后,右边字数组的数为偶数
                        mid = 0 + (mid - 1) / 2;
                    } else {
                        mid = (mid + (arr.length - 1)) / 2;
                    }
                } else {   //中间值与左边的值相等
                    if ((mid + 1) % 2 == 0) { //加上mid对应的数后,左边字数组的数为偶数
                        mid = ((mid + 1) + (arr.length - 1)) / 2;
                    } else {
                        mid = (0 + mid) / 2;
                    }
                }
    
                //判断,到数组的两端了,也break
                if (mid == 0 || mid == arr.length - 1) {
                    break;
                }
            }
            return mid;  //如果数组中有这个元素,则返回
        }
    View Code

         (2)时间复杂度:O(NlogN)

  • 相关阅读:
    tensorflow卷积神经网络-【老鱼学tensorflow】
    tensorflow用dropout解决over fitting-【老鱼学tensorflow】
    tensorflow分类-【老鱼学tensorflow】
    Android 禁用字体大小和显示大小
    Android 自定义广播刷新页面数据信息
    ScrollView嵌套listview显示一行bug
    Android使用scrollview截取整个的屏幕并分享微信
    ToastUtils 工具类
    Android 获取版本号名称工具类
    Android 保存图片到相册
  • 原文地址:https://www.cnblogs.com/hezhiyao/p/7539730.html
Copyright © 2011-2022 走看看