[关闭]
@XQF 2018-03-07T22:56:50.000000Z 字数 1549 阅读 1004

如何找出数组中只出现一次的数字?

数据结构与算法


1.问题1(其他元素出现偶数次)

一个整型数组中,除了一个数只出现了一次之外其他数均出现了两次。
a^a=0;
0^b=b;
这种方法对于偶数次有用,奇数的话就么有办法了

  1. public class Solution {
  2. public int findNotDouble(int[] nums) {
  3. if(nums==null||nums.length){
  4. return -1;
  5. }
  6. int result = 0;
  7. for (int i : nums) {
  8. result ^= i;
  9. }
  10. System.out.println("result:" + result);
  11. return result;
  12. }
  13. public static void main(String[] args) {
  14. Solution solution = new Solution();
  15. int[] nums = {2, 2, 3};
  16. solution.findNotDouble(nums);
  17. }
  18. }

2.问题2(其他元素出现奇数次)

这是3次的情况,至于次数可以用counter控制

  1. public class Solution {
  2. public int findNotDouble(int[] nums) {
  3. if (nums == null || nums.length == 0) {
  4. return -1;
  5. }
  6. Arrays.sort(nums);
  7. int counter = 0;
  8. for (int i = 0; i < nums.length - 1; i++) {
  9. if (nums[i] == nums[i + 1]) {
  10. counter++;
  11. } else {
  12. if (counter == 2) {
  13. if (i == nums.length - 2) {
  14. return nums[nums.length - 1];
  15. }
  16. counter = 0;
  17. } else {
  18. return nums[i];
  19. }
  20. }
  21. }
  22. return 0;
  23. }
  24. public static void main(String[] args) {
  25. Solution solution = new Solution();
  26. int[] nums = {2, 2, 2, 5, 5, 5, 6, 6, 6, 9};
  27. System.out.println("result: " + solution.findNotDouble(nums));
  28. }
  29. }

3.升级版

思想就是统计1的个数,。,一直在思考如何得出这个数字,。原来根据不符合条件位置直接加和就可以了

  1. public class Solution {
  2. public int findNotDouble(int[] nums, int k) {
  3. if (nums == null || nums.length == 0) {
  4. return -1;
  5. }
  6. int[] counteOne = new int[32];
  7. int counter = 1;
  8. for (int i = 0; i < 32; i++) {
  9. for (int j = 0; j < nums.length; j++) {
  10. if ((counter & nums[j]) != 0) {
  11. counteOne[i]++;
  12. }
  13. }
  14. counter <<= 1;
  15. }
  16. int result = 0;
  17. for (int i = 0; i < counteOne.length; i++) {
  18. if (counteOne[i] % k != 0) {
  19. result += 1 << i;
  20. }
  21. }
  22. return result;
  23. }
  24. public static void main(String[] args) {
  25. Solution solution = new Solution();
  26. int[] nums = {2, 2, 2, 3, 5, 5, 5, 6, 6, 6};
  27. System.out.println("result: " + solution.findNotDouble(nums, 3));
  28. }
  29. }

返回-1假设均是正整数的情况下,实际上负数也行,但是不和题意得返回就要看题意了

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注