描述:给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字。
样例:给出 [1,2,2,1,3,4,3],返回 4
挑战:一次遍历,常数级的额外空间复杂度(自主选择)
思路:(1)先不考虑挑战,自己看着写出的代码计算速度很慢也有很多优化的地方。但是毕竟是自己一点没有参考写出来的,希望自己能一点点进步吧。
(2)把数组中的数排序(从小到大)
(3)这种落单只有三种情况:
A. 1,1,2 这时最后两个数不相等 即A[A.length-1]!=A[A.length-2] 时,落单就是最后一个数
B. 1,,2,2 这时数列最前边两个数不相等, 即A[0]!=A[1]时,落单就是第一个数
C. 1,1,2,3,3 这时落单的数在中间,和左右两个数不相等 即这时的判断条件为:A[i]!=A[i+1]&&A[i]!=A[i-1] 落单的数就是A[i]
AC代码:
public class Solution { /** *@param A : an integer array *return : a integer */ public int singleNumber(int[] A) { // Write your code here int result=0; if(A.length==0) { return result; } if(A.length==1) { return A[0]; } for(int i=0;i<A.length-1;i++){ for(int j=i+1;j<A.length;j++){ if(A[i]>A[j]) { int temp=A[i]; A[i]=A[j]; A[j]=temp; } } } if(A[0]!=A[1]) { result=A[0]; } if(A[A.length-1]!=A[A.length-2]) { result=A[A.length-1]; } for(int i=1;i<A.length-1;i++) { if(A[i]!=A[i+1]&&A[i]!=A[i-1]) { result=A[i]; break; } } return result; }}优化算法后续上传
新闻热点
疑难解答