描述:给出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;
}
}
优化算法后续上传