锤击清单

DDD
DDD原创
2024-12-30 16:34:15543浏览

Hammering lists

每周挑战 301

穆罕默德·S·安瓦尔 (Mohammad S. Anwar) 每周都会发出“每周挑战”,让我们所有人都有机会为两周的任务提出解决方案。我的解决方案首先用Python编写,然后转换为Perl。这对我们所有人来说都是练习编码的好方法。

挑战,我的解决方案

任务 1:最大数

任务

给你一个正整数列表,@ints。

编写一个脚本来排列给定列表中的所有元素,使它们形成最大的数字并返回它。

我的解决方案

也许我想太多了,但这并不像听起来那么容易。

一种选择是计算所有排列,并查看哪个数字最大。然而,当我们添加更多整数时,这会消耗大量资源。如果我有 13 个整数,则有超过 60 亿种排列。所以我排除了这个可能的解决方案。

所以显而易见的事情就是对整数进行排序,组合它们并输出结果。由于 Python 对待字符串和整数的方式不同,我需要将排序后的列表转换为字符串,连接它们并将其转换回整数。

def largest_number(ints: list) -> int:
    sorted_ints = sorted(ints, key=cmp_to_key(number_sort), reverse=True)
    return int(''.join(map(str, sorted_ints)))

说到排序,这有点复杂。在提供的第二个示例中,我们可以看到 3、30 和 34 都是给定的整数。为此,我知道最大的数字是通过对项目(从高到低)34、3 和 30 进行排序获得的。

对于我的 number_sort 函数,我将整数转换为字符串 s1 和 s2。然后我得到整数 c1,它是 s1 和 s2 的串联,而 c2 是 s2 和 s1 的串联。

如果 c1 小于 c2,我返回 -1。如果更大,我返回 1。如果它们相同,我返回 0。sorted 函数使用此信息根据需要对列表进行排序。

def number_sort(i1: int, i2: int) -> int:
    s1 = str(i1)
    s2 = str(i2)

    c1 = int(s1 + s2)
    c2 = int(s2 + s1)

    if c1 < c2:
        return -1
    if c1 > c2:
        return 1

    return 0

Perl 代码要简单得多:)

sub number_sort() {
    return "$a$b" <=> "$b$a";
}

示例

$ ./ch-1.py 20 3
320

$ ./ch-1.py 3 30 34 5 9
9534330

任务 2:汉明距离

任务

给你一个整数数组,@ints。

编写一个脚本以返回给定整数数组中所有整数对之间的汉明距离之和。

两个整数之间的汉明距离是它们的二进制表示形式不同的位数。

我的解决方案

在上一个任务中,我提到了 Python 如何将整数和字符串视为不同的类型。 Perl 的优点之一是我们被告知,无论出于何种目的,我们都不需要担心变量的类型。尽管它们在内部存储方式不同,但 Perl 知道该怎么做。

在 Perl 5.10 和 Perl 5.16(这是我大部分 Perl 开发的地方)中,有两个值得注意的例外。一个是 JSON 模块,它将输出字符串“10”和整数 10。

另一个是按位运算。从 perlop 页面,105 | 150(两个整数)是 255,而“105”| “150”(两个字符串)是 155。

所以,当我再次阅读 perlop 页面时,我惊喜地发现这个问题已经在 Perl 的更高版本中得到了解决。它现在具有 Perl 5.22 中实验性的按位功能,并且在 Perl 5.28 中可用。这确保了按位运算符始终将值视为整数,并且基于字符串的按位具有新的运算符。

无论如何,回到手头的任务。为此,我计算两个整数的所有组合。对于每个组合,我对两个值执行 XOR(异或),将其转换为二进制并计算二进制表示中 1 的数量。

def largest_number(ints: list) -> int:
    sorted_ints = sorted(ints, key=cmp_to_key(number_sort), reverse=True)
    return int(''.join(map(str, sorted_ints)))

示例

def number_sort(i1: int, i2: int) -> int:
    s1 = str(i1)
    s2 = str(i2)

    c1 = int(s1 + s2)
    c2 = int(s2 + s1)

    if c1 < c2:
        return -1
    if c1 > c2:
        return 1

    return 0

以上是锤击清单的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn