如何检查数字的每个数字是否大于或等于另一个数字?

时间:2018-06-14 06:38:05

标签: java python algorithm

每个数字应该大于或等于另一个数字。如果所有数字都相等,则返回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;
}

有更好的方法吗? “更好”的定义:

  1. 代码需要简短而优雅
  2. 该算法更好地基于数字计算,并且不包含类型转换,如int - &gt;字符串等。
  3. 两个数字的约束:

    1. 他们是非负数
    2. 位数不一定相同
    3. 感谢您的回复。

2 个答案:

答案 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)

请记住,这里有两个数字需要具有相同数字位数的约束。