我想知道整数数组是否交替。 在JAVA。
例如:
a[]={1,-1,1,-1,1,-1} --> true
a[]={-1,1,-1,1,-1} --> true
a[]={1,-4,1-6,1} --> true
a[]={1,1,1,14,5,3,2} --> false
我已经开始编写一些使用标志的代码。例如,如果current_is_positive=0
和else = 1
,但我没有到达任何地方。实现这种效果的好方法是什么?
答案 0 :(得分:4)
我认为你的意思是交替出现符号,即正数,负数,正数等? 您可以使用以下策略:
略过第一个元素。
对于其他每个元素,将其符号与前一个元素的符号进行比较:
由于这听起来像是家庭作业,我会留给你用Java编写适当的代码。
答案 1 :(得分:1)
这是我的解决方案:
这检查元素n + 1是元素n的倒数。
public static void main(String[] args) {
int[] ints = {1, -1, 2, -1};
System.out.println(new Example().isArrayAlternating(ints));
}
public boolean isArrayAlternating(int[] ints) {
if (ints == null || ints.length % 2 != 0) {
return false;
}
for (int i = 0; i < ints.length - 1; i++) {
if (ints[i] != ints[i + 1]*(-1)) {
return false;
}
}
return true;
}
如果您只想检查正数,负数... n次,而不注意值:
public static void main(String[] args) {
int[] ints = {1, -1, 2, -1};
System.out.println(new Example().isArrayAlternating(ints));
}
public boolean isArrayAlternating(int[] ints) {
if (ints == null || ints.length % 2 != 0) {
return false;
}
for (int i = 0; i < ints.length - 1; i++) {
if (ints[i] >= 0 && ints[i + 1] >= 0 || ints[i] <= 0 && ints[i + 1] <= 0) {
return false;
}
}
return true;
}
答案 2 :(得分:0)
您可以简单地检查所有项目是否与两步后面的项目相同。我不知道你使用的语言是什么,但是例如使用C#你可以这样做:
bool alternating = a.Skip(2).Where((n, i) => a[i] == n).Count() == a.Length - 2;
所以你想检查值的符号是否是交替的,而不是值?
然后只需检查上一项的标志:
bool alternating = a.Skip(1).Where((n,i) => Math.Sign(n) == -Math.Sign(a[i])).Count() == a.Length-1;
答案 3 :(得分:0)
boolean prevPositive = arr[0] > 0, error = false;
for (int i = 1; i < arr.length; ++i) {
boolean current = arr[i] > 0;
if (current != prevPositive) {
current = prevPositive;
} else {
error = true;
break;
}
}
if (error)
System.out.println("No");
else
System.out.println("Yes");
答案 4 :(得分:0)
0, 2, 4, 6, ...
然后从索引循环 - 1, 3, 5, 7, ...
然后检查两次循环中每个数字的乘以该迭代中的第一个数字是否为正。
int a[]={1,-1,1,-1,1,-1};
boolean alternating = true;
for (int i = 0; i < a.length; i = i + 2) {
if (a[i] * a[0] > 0) {
} else {
alternating = false;
}
}
for (int i = 1; i < a.length; i = i + 2) {
if (a[i] * a[1] > 0) {
} else {
alternating = false;
}
}
if (alternating) {
System.out.println("Array is alternating");
} else
System.out.println("Array is not alternating");
}
答案 5 :(得分:0)
private enum SIGN {
POSITIVE, NEGATIVE
};
public static boolean isAlternating(int... ints) {
SIGN last = null;
for (int i : ints) {
if (i >= 0) {
if (last == null) {
last = SIGN.POSITIVE;
} else {
if (last == SIGN.POSITIVE) {
return false;
} else {
last = SIGN.POSITIVE;
}
}
} else {
if (last == null) {
last = SIGN.NEGATIVE;
} else {
if (last == SIGN.NEGATIVE) {
return false;
} else {
last = SIGN.NEGATIVE;
}
}
}
}
return true;
}
答案 6 :(得分:0)
从索引1直到结束运行数组。
在每个索引处,评估(a[i] > 0) == (a[i-1] > 0)
。如果这是真的,那么你的数组不会交替。
如果直到结束而没有结束它不是交替的,那么它是交替的:)
答案 7 :(得分:-2)
For i = 2 to n
check whether A[i-1] && A[i] are with diff sign..
in C++; return ((A[i-1] ^ A[i]) < 0).
同样在此解释:http://www.youtube.com/watch?v=Z59REm2YKX0
修改强>
如果整数为负,则高位为1.否则为0.您可以通过将它们一起进行异或来检查两个整数是否具有不同的符号。如果符号不同,则结果的高位为1.如果它们相同,则高位为0.因此,
XOR B&lt; 0相当于“A和B有不同的符号”
Peter Ruderman