每个数字应该大于或等于另一个数字。如果所有数字都相等,则返回false。
示例:
201 >= 200 true
200 >= 200 false
200 >= 101 false
210 >= 201 false
普通方法不断除以10,然后比较余数。
以下是Java中的代码:
private boolean isScoreBetter(final int score, final int scoreToCompare) {
int a = score;
int b = scoreToCompare;
int betterCount = 0;
while (a > 0 && b > 0) {
int temp = a % 10 - b % 10;
if (temp < 0) {
return false;
}
if (temp > 0) {
betterCount++;
}
a /= 10;
b /= 10;
}
return betterCount > 0 && a >= b;
}
有更好的方法吗? “更好”的定义:
两个数字的约束:
感谢您的回复。
答案 0 :(得分:6)
str1 = '000'
str2 = '111'
all(a >= b for a, b in zip(str1, str2))
# False
all(a >= b for a, b in zip(str2, str1))
# True
答案 1 :(得分:1)
如果您不想将数字转换为字符串(正如您在编辑中所说的那样),那么还有不止一种方法可以实现。
您可以编写一个迭代器,为您提供下一个数字:
def next_digit(number):
while (number > 1):
yield number % 10
number = number // 10
然后您可以map
覆盖所有值,并像其他答案一样使用all
:
a = 201
b = 200
res = all(map(lambda d: d[0] >= d[1], zip(next_digit(a), next_digit(b))))
print(res) # True
或者您可以使用filter
并查看是否有任何数字不符合条件:
res = filter(lambda d: d[0] < d[1], zip(next_digit(a), next_digit(b)))
print(res) # []
但是,如果您的数字位数非常大,那么这些方法可能效率低下,因为无论如何它们都会遍历所有数字。
你可以编写一个推出的for循环,并通过在不符合你的标准的第一个数字上突破它来优化一点。
你也可以用迭代器来做到这一点:
def next_two_digits(a, b):
while (a > 1 and b > 1):
yield (a % 10, b % 10)
a = a // 10
b = b // 10
你可以将它用作前一个:
res = all(map(lambda d: d[0] >= d[1], next_two_digits(a, b)))
print(res) # True
res = filter(lambda d: d[0] < d[1], next_two_digits(a, b))
print(res) # []
或者你可以做展开循环的事情:
matching = True
for d in next_two_digits(a, b):
if (d[0] < d[1]):
matching = False
break
print(matching)
请记住,这里有两个数字需要具有相同数字位数的约束。