どの要素を繰り返すのユニークな配列を見つけるには?

クリエイティブコモンズライセンス 著作権:帰属、紙ベースを作成するために他人を許可し、(同じライセンスで元のライセンス契約に基づいて用紙配布する必要がありますクリエイティブコモンズ

(アレイ)タイトル:

    唯一の要素値が繰り返され、ある場合、アレイ内の番号1〜1000は、1001個の要素が含まれ、他の数値は一度だけ発生されます。重複要素を見つけるためにアルゴリズムを設計発言、それは配列の各要素は一度だけアクセスできることが必要です。あなたは、アルゴリズムを設計する能力を補助収納スペースを使用しない場合は?

分析:

      初めてこの問題を見て、いくつかの条件に特別な注意を払います:

             1.各配列要素は、一度だけアクセスすることができます。(あなたが複数回にアクセスできる場合、それはゆっくりとオーバー横断することができますが、時間の複雑さが増加したことになります)

             2.補助収納スペースを使用しないでください(あなたはこの補助スペースの問題を使用することができれば、それは非常に容易になります)

             3.配列要素(1001〜1000配列番号1は、要素を含む)、そう試験方法は、特別な注意をすべき場合

            XORとして、かなりの程度まで、問題を解決し、排他的ではないか、コンセプトが多くのことを紹介し、Baiduのを所有することができます。具体的な詳細は、コードを確認してください。

コード:

    /**
     *
     * @param arr:
     * 数组
     * @return
     * 重复的元素
     */
    public static int findDup(int[] arr) {
        if (arr==null) return  -1;//如果if条件判断,只有一条语句,可以省略{}

        //声明空间,减少变量的声明
        int len=arr.length;
        int result=0;
        int i;

        //将数组中的所有异或运算
        for (i=0;i<len;i++){
            result^=arr[i];
        }
        //因为从数字1到1000,所以我在这里借助1:1000的数字去和数组的元素异或运算
        for (i=1;i<len;i++){
            result^=i;
        }
        //返回重复元素的值
        return result;
    }

 

おすすめ

転載: blog.csdn.net/longyanchen/article/details/92968405