給定來自CodingBat的任務sameEnds:
N
如果陣列開頭和結尾的數字組相同,則回傳 true 。例如, with , and{5, 6, 45, 99, 13, 5, 6}
的結尾是相同的,n=0
and的結尾是n=2
false 。您可以假設它在包含的范圍內。n=1
n=3
n
0..nums.length
sameEnds([5, 6, 45, 99, 13, 5, 6], 1) → false sameEnds([5, 6, 45, 99, 13, 5, 6], 2) → true sameEnds([5, 6, 45, 99, 13, 5, 6], 3) → false
我對這個問題的解決方案通過了絕大多數測驗,但不是全部:
public boolean sameEnds(int[] nums, int len) {
if (nums.length >= len * 2) {
for (int i = 0, j = nums.length - 1 ; i < len && len > 0; i , j--) {
if (nums[i] != nums[j]) {
return false;
}
}
}
return true;
}
我的問題如下:
- 可以做些什么來修復我的解決方案?
- 是否可以使用Stream API解決此任務?
uj5u.com熱心網友回復:
您可以使用allMatch()
操作來通過流實作它。
該解決方案通過了CodingBat上的所有測驗用例:
public boolean sameEnds(int[] nums, int len) {
return java.util.stream.IntStream.range(0, len)
.allMatch(n -> nums[n] == nums[nums.length - (len - n)]);
}
對您的命令式解決方案的修復可能如下所示:
public boolean sameEnds(int[] nums, int len) {
for (int i = 0, j = nums.length - 1 - (len - 1); i < len && i < nums.length; i , j ) {
if (nums[i] != nums[j]) {
return false;
}
}
return true;
}
我洗掉了包裝 if 條件,因為 whennums.length >= len * 2
被評估false
意味著需要比較的子陣列重疊,但這并不意味著這些子陣列是相等的。
j
表示尾部子陣列中位置的變數已初始化為nums.length - 1 - (len - 1)
- 最后一個有效索引減去子陣列的長度。并且回圈的所謂增量陳述句由改為。for
j--
j
uj5u.com熱心網友回復:
如果您使用的是 Java 9 或更高版本,則可以使用內置方法Arrays.equals :
public boolean sameEnds(int[] nums, int len) {
return Arrays.equals(nums, 0, len, nums, nums.length - len, nums.length);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/488442.html