[英]CodingBat-Excercise: Return true if the given array contains an unlucky 1 in the first 2 or last 2 positions in the array
我们会说数组中紧跟 3 的 1 是“不吉利的”1。如果给定的数组在数组的前 2 或后 2 位置包含不吉利的 1,则返回 true。
练习可以在这里找到:
http://codingbat.com/prob/p197308
我自己的方法是这样的:
public boolean unlucky1(int[] nums) {
for (int i = 0; i < nums.length-1; i++) {
if (nums[i] == 1 && nums[i+1] == 3)
return true;
}
return false;
}
除了 [1, 1, 1, 3, 1] 之外的每个数组都是如此。 现在我明白了为什么它不适用于这个数组,但为什么它适用于 [2, 1, 3, 4, 5] 那么呢? 该数组的前两个或最后一个位置也没有 1 后跟 3。 我把这个练习弄错了吗?
看起来你没有遵守规则。 您不需要遍历整个数组。 您应该只测试前两个和最后两个元素。
编辑 :
再次阅读练习,即使后面的 1 和 3 在数组的索引 1 和 2 中,您似乎也应该返回 true (因为要求不幸的 1 位于前两个或最后两个位置 - 3 没有不必处于前两个位置)。
public boolean unlucky1(int[] nums) {
if (nums.length > 1) {
if (nums[0] == 1 && nums[1] == 3)
return true;
if (nums[nums.length-2] == 1 && nums[nums.length-1] == 3)
return true;
}
if (nums.length > 2 && nums[1] == 1 && nums[2] == 3) {
return true;
}
return false;
}
问题定义是
前 2 位或后 2 位中的 1
**[X,X,.......,X,X]**
\ / \ /
first last
2 2
positions positions
X
标记的位置是倒霉1可以定位的位置。
[2, 1,3 ,.....,4,5]
[X, X ,.......,X,X]
倒霉的 1在前两个元素中。
例如 :
if(nums.length<2){
return false;
}
for (int i = 0; i<2;i++) {
if(nums[i]==1&&nums[i+1]==3){
return true;
}
}
for (int i = nums.length-1; i>nums.length-2;i--) {
if(nums[i-1]==1&&nums[i]==3){
return true;
}
}
return false;
public boolean unlucky1(int[] nums) {
if(nums.length>1){
if(nums[0]==1 && nums[1]==3) return true;
if(nums[1]==1 && nums[2]==3) return true;
if(nums[nums.length-2]==1 && nums[nums.length-1]==3) return true;
}
return false;
}
我正在尝试用尽可能少的代码行来解决那些 CodingBat 问题。 让我分享一下我使用三元运算符解决这个问题的方法。
public boolean unlucky1(int[] nums) {
return nums.length <= 1 ? false : (nums.length == 2 && nums[0] == 1 && nums[1] == 3) ? true
: (nums[0] == 1 && nums[1] ==3) ? true : (nums[1] == 1 && nums[2] ==3)
? true : (nums[nums.length-2] == 1 && nums[nums.length-1] ==3);
}
此代码工作正常: -
public boolean unlucky1(int[] nums) {
int length=nums.length;
if(nums.length==0||nums.length==1){
return false;
}
else if((nums[0]==1&&nums[1]==3)||(nums[1] ==1 && nums[2] ==3)||(nums[length-1]==3)&&nums[length-2]==1){
return true;
}
return false;
}
我的解决方案通过了所有测试:
public boolean unlucky1(int[] nums) {
if (nums.length == 2 && nums[0] == 1 && nums[1] == 3) {
return true;
}
if (nums.length >= 3) {
for (int i = 0; i < 2; i++) {
if (nums[i] == 1 && nums[i+1] == 3) {
return true;
}
if (nums[nums.length - 2] == 1 && nums[nums.length - 1] == 3) {
return true;
}
}
}
return false;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.