面试专题数据结构

数组中出现一个数字出现次数的问题

2018-06-14  本文已影响4人  Taoyongpan

一个数组中只有一个数字出现奇数次,其他都是出现偶数次,时间复杂度为O(n);

/**
 * Author: Taoyongpan
 * Date: Created in 9:35 2018/6/14
 * 一个数组中只有一个数只出现了奇数次,其他都是出现偶数次,时间复杂度为O(n)
 */
public class Test10 {
    public static void main(String[] args) {
        int[] arr = {1,1,2,3,4,2,3,};
        int res = arr[0];
        for (int i = 1 ; i< arr.length;i++){
            res^=arr[i];
        }
        System.out.println(res);
    }
}

一个数字有两个数出现奇数次其他都是出现偶数次

/**
 * Author: Taoyongpan
 * Date: Created in 9:42 2018/6/14
 * 数组中只出现一次的两个数字
 * 方法,将 两个不同的数分别放置到两个数组中,
 * 通过二进制的某一位,是0或者1将整个数组拆分开
 */
public class Test12 {
    public static void main(String[] args) {
        int[] arr = {1,1,2,3,4,2,};
        int res = 0;
        int j = 0;
        int num1 = 0;
        int num2 = 0;
        for (int i = 0 ; i < arr.length ; i++ ){
            res^=arr[i];
        }
        for (j = 0 ;j < 32;j++){
            if (((res>>j)&0)==0){
                break;
            }
        }
        for (int i = 0;i<arr.length;i++){
            if (((arr[i]>>j)&1)==1)
                num1^=arr[i];
            else
                num2^=arr[i];
        }
        System.out.println(num1);
        System.out.println(num2);
    }
}

一个数组中只有一个数出现一次,其他都是出现三次,输出这个数:

/**
* Author: Taoyongpan
* Date: Created in 9:38 2018/6/14
* 一个数组中只有一个数字出现了一次 ,其他都是出现了三次,
* 在O(n)的时间复杂度中,求出这个只出现一次的数
* 解法:当一个数组每一个数都出现三次的时候,二进制表示上面每一位 1的个数肯定是三的倍数,
* 当不是三的倍数的时候,说明只出现一次的那个数此位上为1
*/
public class Test11 {
  public static void main(String[] args) {
      int[] a = {1,1,1,2,2,2,3};
      int[] bits = new int[32];
      for (int i = 0; i < a.length; i++)
          for (int j = 0; j < 32; j++)
              bits[j] += ((a[i] >> j) & 1);
      int res = 0;
      for (int j = 0; j < 32; j++)
          if (bits[j] % 3 != 0)
              res += (1 << j);
      System.out.println(res);
  }
}
上一篇下一篇

猜你喜欢

热点阅读