给出 2 * n + 1 个数字,除其中一个数字之外其他每个数字均出现两次,给出的 2 * n + 1 个数字不包含整数最小值,找到这个数字,如没有则返回整数最小值。
package com.loo; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; public class SingleNumber { public static void main(String[] args) { int[] arr = new int[] {-2 , 6 , -9 , 1 , 5 , 1 , 6 , -9 , 5} ; System.out.println(getSingleNumber(arr)); int[] arr2 = new int[] {5 , -6 , 8, 1 , -2 , 5 , 8 , -10 , 2 , -6}; System.out.println(Arrays.toString(getSingleNumbers(arr2).toArray())); } // 异或运算具有很好的性质,相同数字异或运算后为 0,并且具有交换律和结合律, // 故将所有数字异或运算后即可得到只出现一次的数字。 public static int getSingleNumber(int[] arr) { if (arr == null || arr.length == 0) { return Integer.MIN_VALUE; } // 按照题目意思,是给 2 * n + 1 个数字 if ((arr.length & 1)==0) { return Integer.MIN_VALUE; } int result = 0; for (int i=0;i getSingleNumbers(int[] arr) { Listlist = new ArrayList (); if (arr == null || arr.length == 0) { return list; } Map map = new HashMap (); for (int i=0;i 1) { // 出现了两次以上的数,这里只是寻找只出现一次的数,所以这里忽略 continue; } else { list.add(key); } } return list; } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)