ネクタイネットアルゴリズム学習ノート--27


ネクタイネットアルゴリズム学習ノート
このシリーズのアルゴリズムのテーマはネクタイネットから来ます
配列クラスアルゴリズム2日目
タイトル:
配列*nums*と値valを指定すると、*val*に等しいすべての数値の要素をその場で除去し、除去後の配列の新しい長さを返す必要があります.
余分な配列空間を使用しないでください.入力配列をその場で変更し、O(1)余分な空間を使用する条件で完了する必要があります.
要素の順序は変更できます.配列の中で新しい長さの後ろを超える要素を考慮する必要はありません.
例:
   nums = [3,2,2,3], val = 3,
           2,    nums           2。

   nums = [0,1,2,2,3,0,4,2], val = 2,
           5,    nums          0, 1, 3, 0, 4。

問題解決の考え方:
考え方一:
前編の考え方によれば、第1の感覚は、変数を定義し、初期値を0とし、指定値でなければその変数を位置とする配列値に値を付与し、その後、その変数+1、最後に新しい配列の長さがその変数の値であると判断することである.
class Solution {
    public int removeElement(int[] nums, int val) {
        int nonValIndex = 0;
        for(int i=0;i<nums.length;i++){
            if(nums[i] != val){
                nums[nonZeroIndex++]=nums[i];
            }
        }
        return nonValIndex;
    }
}
//   9ms  

次のことを考えます.
この解題の構想は5 msの構想と一致しているが,自己増加を賦値の中に入れただけで,後で自己増加を賦値文から出す.
ネクタイの上のこの問題の他の高品質の例:
class Solution {
        public int removeElement(int[] nums, int val) {
        int begin = 0;
        if (nums.length == 0) {
            return 0;
        } else if (nums.length == 1) {
            if (nums[0] == val) {
                return 0;
            } else {
                return 1;
            }
        }
        int end = nums.length - 1;
        while (begin < end) {
            //         val   
            while (nums[begin] != val && begin < end) {
                begin++;
            }
            //           val   
            while (nums[end] == val && begin < end) {
                end--;
            }

            if (begin != end) {
                int tmp = nums[begin];
                nums[begin] = nums[end];
                nums[end] = tmp;

            } else {
                if (nums[begin] != nums[end]){
                    return end + 1;
                }else{
                    if(nums[end] == val){
                        return end;
                    }
                    return end + 1;
                }
            }
        }
        return end;
    }
}
//   6ms

自己整理:
この部分のコードの構想は私が思わなかったで、しかもこの部分のコードは1つの私のとても好きな点があって、私の現在欠けている点で、コードを実行する前に条件に対して判断を行って、条件が根本的に満たさないため直接循環の主要なコードの実行に異常が現れることを避けました.この問題の構想は以下の通りである.
  • は、最初から巡回して得られた最初の指定値の位置を、配列がすべて巡回するまで、最後から逆方向に巡回して得られた最初の指定値ではない位置の値と交換する.
  • このようにして得る配列の前面部分は非指定値であり、背面部分は指定値であり、
  • である.
  • 新しい配列の長さは、前の部分の長さです.

  • 自己総括:
    普段は必ず良い習慣を身につけて、コードを書く時、入ってきたパラメータに対してデータの判断を行って、入ってきたデータの誤り、あるいは空の値によってプログラムの異常あるいはBugが現れることを避けます.判断と同時に解決策を実現できる.