【问题标题】:How to check every digit of a number is greater or equal than another number?如何检查一个数字的每个数字是否大于或等于另一个数字?
【发布时间】:2018-06-14 06:38:05
【问题描述】:

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

两个数的约束:

  1. 它们是非负数
  2. 位数不一定相同

感谢您的回复。

【问题讨论】:

  • 对于单个数字,词法和数字比较是相同的,你可以all(a &gt;= b for a, b in zip(str(n1), str(n2)))
  • 你如何协调210 &gt;= 201 false210 &lt; 201 false
  • @ReblochonMasque 这是partial order
  • 你如何定义“更好”?你的意思是更快、更少的代码、更少的内存,还是别的什么?
  • @ChatterOne 嗨 Chatter,“更好”的定义是更新 :)

标签: java python algorithm


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    如果您不想将数字转换为字符串(正如您在编辑中所说的那样),还有不止一种方法可以做到这一点。

    你可以编写一个迭代器来给你下一个数字:

    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)
    

    请记住,这里有一个限制,即两个数字需要具有相同的位数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 2023-01-30
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多