这个问题是关于CodingBat Java部分Array-2的“sameEnds”问题:
如果数组开头和结尾的
n
数字组相同,则返回true。例如,对于{5, 6, 45, 99, 13, 5, 6}
,n=0
和n=2
以及false
和n=1
的{{1}}的结尾相同。您可以认为n=3
的范围为n
。
CodingBat服务器为所有情况传递代码#2,包括“其他测试”但不代码#1。代码#1仅对所谓的“其他测试”失败。代码#1失败的那些其他测试用例是什么?这两个代码之间有什么区别?
代码#1:
0..nums.length
代码#2:
public boolean sameEnds(int[] nums, int len) {
for (int i = 0; i < len && len > 0; i++, len--)
if (nums[i] != nums[(nums.length) - len]) return false;
return true;
}
答案 0 :(得分:2)
代码1的问题在于,您每次都会递减len
,但仍会将其用作i
循环中for
的结束索引。考虑一下......如果len
最初是10,i
只会计为5,因为循环5次,i
会增加到5和len
将减少到5。
您可以将len
复制到用于索引的第二个变量,并仅使用len
检查i
以结束循环。但就我个人而言,无论如何我发现你的“Code 2”更具可读性和干净性,所以我会坚持下去。
答案 1 :(得分:1)
感谢David Norris
和其他立即回复此问题的人。我了解到,当for循环框架如下所示
i < len && len > 0; i++, len--
根据Code 1
的循环提前终止,因为每次迭代都会递减len
值。因此,考虑Specification
和测试用例
({1, 2, 5, 2, 1}, 5)
循环仅在三次迭代后终止,
0 < 5 && 5 >0
1 < 4 && 4 > 0
2 < 3 && 3 > 0
它应该迭代5次并检查整个子阵列。这就是codingbat
服务器不接受Code 1
作为确切答案的原因。
我修复了Code 1
,如下所示,codingbat
服务器已接受解决方案作为正确答案。
更正代码1:
public boolean sameEnds(int[] nums, int len) {
for (int i = 0; len > 0; i++) {
if (nums[i] != nums[(nums.length) - len]) return false;
len--;
}
return true;
}
答案 2 :(得分:0)
不同之处在于,在代码1中,您通过减少它来改变循环内的条件('i&lt; len')。你可以复制'len'来避免这种情况。
答案 3 :(得分:0)
public boolean sameEnds(int[] nums, int len) {
if (nums.length > 1 && len > 0)
{
if (nums[len-1] == nums[nums.length-1])
{
return true;
}
}
if (len == 0 || nums.length == 1) return true;
return false;
}
答案 4 :(得分:0)
这是使用字符串的解决方案。
public boolean sameEnds(int[] nums, int len) {
//Create 2 blank strings.
String testOne = "";
String testTwo = "";
//For the amount of len, we make strings starting from each side, and ending at len
//inwards.
for (int i = 0; i < len; i++)
{
//testOne is for the left side.
testOne = testOne + String.valueOf(nums[i]);
//testTwo is for the right side.
testTwo = String.valueOf(nums[(nums.length - 1) - i]) + testTwo;
}
//If they equal, return true. If they don't, return false;
return (testOne.equals(testTwo));
}
答案 5 :(得分:0)
这是我的解决方案,比较两个数组:
public boolean sameEnds(int[] nums, int len) {
int length = nums.length;
int[] arr = new int[len];
for (int i = 0; i < arr.length; i++) {
arr[i] = nums[i];
}
for (int i = 0; i < arr.length; i++) {
if (arr[i] != nums[i+length-len]) return false;
}
return true;
}
答案 6 :(得分:0)
这也可能有帮助。
public boolean sameEnds(int[] nums, int len) {
// Creating two arrays A & B to store first and last (len) numbers
int[] arrA = new int[len];
int[] arrB = new int[len];
// Storing first set of integers in arrA
for(int i = 0; i <len; i++) {
arrA[0] = nums[i];
// System.out.print(arrA[0]);
}
// Storing second set of integers in arrB
int pos = 0;
for (int j = (nums.length)-len; j < (nums.length); j++) {
arrB[pos] = nums[j];
// System.out.println(arrB[pos]);
}
// Comparing and returning boolean values
return Arrays.equals(arrA,arrB);
}
答案 7 :(得分:-1)
public boolean sameEnds(int[] nums, int len) {
boolean b = true;
if (len == 0) {
b = true;
}
for (int i = 0; i < len; i++) {
if (nums[i] != nums[nums.length - len + i]) {
b = false;
break;
}
}
return b;
}