如何编写一个名为isMeera的函数,如果其数组参数是Meera数组,则返回1.否则,返回0
本文关键字:返回 数组 参数 如果 否则 Meera 函数 何编写 一个 isMeera | 更新日期: 2023-09-27 18:14:11
Meera数组定义为包含至少一个奇数,并且以相同数量的偶数开始和结束的数组。
所以{4,8,6,3,2,9,8,11,8,13,12,12,6}是一个Meera数组,因为它以三个偶数开始,以三个偶数结束,并且包含至少一个奇数。数组{2,4,6,8,6}不是Meera数组,因为它不包含奇数。数组{2,8,7,10,- 4,6}不是Meera数组,因为它以两个偶数开始,但以三个偶数结束。这是我的尝试,但没有得到结果。请帮帮我!提前感谢!
public static int isMeera(int [] a){
boolean hasOdd = false;
int firstEven = 0;
int lastEven = 0;
boolean firstCountEnd = false;
boolean lastCountEnd = false;
for(int i = 0; i<a.length; i++){
if (a[i]%2 == 1)
{
hasOdd = true;
break;
}
}
for (int j = 0; j<a.length; j++){
if(a[(a.length - 1) - j] % 2 == 1){
firstCountEnd = true;
if ((!firstCountEnd) && (a[j]%2==0)){
firstEven ++;
}
}
if(a[(a.length - 1) - j] % 2 == 1){
lastCountEnd = true;
if ((!lastCountEnd) && (a[j]%2==0)){
lastEven ++;
}
}
}
if (hasOdd && firstEven == lastEven)
return 1;
return 0;
}
这是一个可行的答案!
public static bool IsMirra(int[] l1)
{
return((l1.Select(l=>l%(1<<1)==(1>>1)?'l':'1').TakeWhile(l=>(l^(((1<<1)+(1<<(1^1))<<((1<<1)<<1))+(1<<(1^1))))!=(l^l)).Count()-l1.Select(l=>l%(1<<1)==(1>>1)?'l':'1').Reverse().TakeWhile(l=>(l^(((1<<1)+(1<<(1^1))<<((1<<1)<<1))+(1<<(1^1))))!=(l^l)).Count())==(1^1))&&(l1.Select(l=>l%(1<<1)==(1>>1)?'l':'1').Any(l=>(l^(((1<<1)+(1<<(1^1))<<((1<<1)<<1))+(1<<(1^1))))==(l^l)));
}
如果你真的想要一个清晰的答案,而不仅仅是一个功能性的答案,我很乐意帮助你,只要你付出努力,自己试一试。
编辑
好吧,既然你确实付出了一些努力并发布了你所拥有的,这里有一些提示:
- 检查数组中是否至少有一个奇数。
- 添加一段代码,获取数组并计算数组开头有多少偶数。
- 现在添加一段代码,该代码获取数组并计算数组以多少偶数结束。
我认为你的代码#1工作-它看起来不错。我建议去掉你的第二个循环,把它分成两个循环——一个从数组的开头开始,向前计数,一个从末尾开始,向后计数。如果没有奇数,你可以跳过这两个循环因为你已经知道它不是一个"奇迹"。数组。
你可以做更多的优化来减少你需要访问的数组元素的数量,但现在我专注于写一个清晰的,正确的解决方案,而不一定是最优化的解决方案。
顺便说一下,所有这些基本上就是我的非常混乱的代码所做的-它计算了数组的前导偶数的数量,它计算了数组的反向副本的前导偶数的数量(即终端偶数的数量),并检查了至少存在一个奇数
终于成功了!
public static int isMeera(int [] a){
boolean hasOdd = false;
int firstEven = 0;
int lastEven = 0;
boolean firstCountEnd = false;
boolean lastCountEnd = false;
for(int i = 0; i<a.length; i++){
if (a[i]%2 == 1)
{
hasOdd = true;
break;
}
}
if (!hasOdd)
return 0;
for (int j = 0; j<a.length; j++){
if(a[j]%2==1)
firstCountEnd=true;
if(!firstCountEnd && a[j]%2==0)
firstEven++;
if(a[(a.length-1)-j]%2==1)
lastCountEnd=true;
if(!lastCountEnd && a[(a.length-1)-j]%2==0)
lastEven++;
}
//System.out.println(firstEven +" " +lastEven);
if (hasOdd && firstEven == lastEven)
return 1;
return 0;
}