lintcode-简单-落单的数

来源:互联网 发布:腾讯网络手机游戏 编辑:程序博客网 时间:2024/06/05 02:58

描述:给出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;    }}

优化算法后续上传

0 0
原创粉丝点击