トピックは次のとおりです
整数配列を入力し、すべての奇数が配列の前半にあり、すべての偶数が配列の後半にあるように、配列内の数値の順序を調整する関数を実装します。
例:
入力:nums = [1,2,3,4]
出力:[1,3,2,4]
注:[3,1,2,4]も正解の1つです。
独自のアルゴリズムとコード
(アルゴリズムクラスは正しく実行および送信され、主にデータを格納するための新しい配列の作成でメモリ消費量が高くなります)
- 新しい配列
result[]
と2つのフラグfirst
とを作成last
し、最初の0
位置である最初のnums.length-1
位置に結果[]を指定します。 - 配列番号を後ろから前にトラバースします。
- nums [i]が偶数の場合は、それをresult []の最後の位置に追加し、最後の1つの位置を前方に移動し
last--
ます。 - nums [i]が奇数の場合は、それをresult []の最初の位置に追加し、最後の1つの位置、つまり
first++
;を戻します。
- nums [i]が偶数の場合は、それをresult []の最後の位置に追加し、最後の1つの位置を前方に移動し
- 次に、result []を返します。
public class Solution {
public static int[] exchange(int[] nums) {
int[] result = new int[nums.length];
int first = 0;
int last = nums.length-1;
for (int i = nums.length-1; i >= 0; i--){
if (nums[i]%2 == 0){
result[last] = nums[i];
last--;
}else {
result[first] = nums[i];
first++;
}
}
return result;
}
public static void main(String[] args) {
int[] nums = {
1,2,3,4};
int[] result = exchange(nums);
for (int num : result){
System.out.println(num);
}
}
}
参照アルゴリズムとコード
ダブルポインタ
- ヘッドポインタ
left
とテールポインタを定義しますright
。 - 左は、それが指す値が偶数になるまで右に移動されました
- 右は、それが指す値が奇数になるまで左に移動し続けます
- 交換
nums[left]
とnums[right]
。 - まで上記の操作を繰り返し
left==right
ます。
public class Solution {
public static int[] exchange1(int[] nums) {
int left = 0;
int right = nums.length-1;
int temp;
while (left < right){
if (nums[left]%2 != 0){
//奇数
left++;
continue;
}
if (nums[right]%2 == 0){
//偶数
right--;
continue;
}
temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
return nums;
}
public static void main(String[] args) {
int[] nums = {
1,2,3,4};
int[] result = exchange1(nums);
for (int num : result){
System.out.println(num);
}
}
}