CodingBatからタスクnotAloneが与えられた場合:
配列内の要素の前後に値があり、それらの値が異なる場合、その要素は「単独」であると言えます。指定された配列のバージョンを返します。指定された値のすべてのインスタンスが、その左または右のいずれか大きい方の値に置き換えられます。
notAlone([1, 2, 3], 2) → [1, 3, 3]
notAlone([1, 2, 3, 2, 5, 2], 2) → [1, 3, 3, 5, 5, 2]
notAlone([3, 4], 3) → [3, 4]
この問題に対する私の解決策は、大部分のテストに合格しますが、すべてではありません。
public int[] notAlone(int[] nums, int val) {
int[] notAlone = new int[nums.length];
int largestNeighbour = 0;
if (notAlone.length >= 1) {
notAlone[0] = nums[0];
notAlone[notAlone.length - 1] = nums[nums.length - 1];
}
for (int i = 1; i < notAlone.length - 1; i++) {
if (nums[i] != val) {
notAlone[i] = nums[i];
}
if (nums[i] == val) {
notAlone[i] = Math.max(nums[i - 1], nums[i + 1]);
}
}
return notAlone;
}
私の質問は次のとおりです。
解決策を修正するにはどうすればよいですか?
Stream APIを使用してこのタスクを解決することは可能ですか?
配列内の要素は、その前後に値があり、それらの値がそれと異なる場合、「単独」です
現在の配列要素が単独であるかどうかをチェックしていないため、ソリューションはすべてのテストに合格しません。つまり、現在の要素がターゲット値と等しいかどうかのみをチェックしており、左または右。
これがストリームを使用して実行できる方法です。以下のコードはCodingBatのすべてのテストに合格します。
public int[] notAlone(int[] nums, int val) {
return IntStream.range(0, nums.length)
.map(i -> isAlone(nums, val, i) ?
Math.max(nums[i - 1], nums[i + 1]) : nums[i])
.toArray();
}
public boolean isAlone(int[] nums, int val, int i) {
return nums[i] == val && i > 0 && i < nums.length - 1
&& nums[i - 1] != val && nums[i + 1] != val;
}
あなたが提供した命令コードは、そのように修正できます(すべてのテストに合格します):
public int[] notAlone(int[] nums, int val) {
if (nums.length == 0) return nums; // guarding against an empty array
int[] notAlone = new int[nums.length];
notAlone[0] = nums[0];
notAlone[nums.length - 1] = nums[nums.length - 1];
for (int i = 1; i < notAlone.length - 1; i++) {
if (nums[i] == val && nums[i - 1] != val && nums[i + 1] != val) { // is "alone"
notAlone[i] = Math.max(nums[i - 1], nums[i + 1]);
} else { // is not "alone"
notAlone[i] = nums[i];
}
}
return notAlone;
}
Эта статья взята из Интернета, укажите источник при перепечатке.
Если есть какие-либо нарушения, пожалуйста, свяжитесь с[email protected] Удалить.
я говорю два предложения