“判断两个长度不同(数位不等)的整数能否顺序拼接成最大的一个整数”算法诞生记——算法学习笔记


【点击此处跳转笔记正文】

Python 官网:https://www.python.org/


  • Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……

  • My CSDN主页、My HOT博、My Python 学习个人备忘录
  • 好文力荐、 老齐教室

  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


等风来,不如追风去……

这是我参加“14天阅读挑战赛”第二周第2篇

点击查看“14天阅读挑战赛”详情



“判断两个长度不同(数位不等)的整数能否顺序拼接成最大的一个整数”
算法诞生记
(——算法学习笔记)


  “判断两个长度不同(数位不等)的整数能否顺序拼接成最大的一个整数”,在码上一篇学习笔记“最大整数”(点击“最大整数”跳转笔记查看详情)代码的时候,有这样的需求。伤些脑力,耗些时光,最终还是达成目的,记此笔记,焯个印记。

问题分析:要使拼接的整数大,大的数字放在前面就好。直接比较,大数在前拼接就是最大。这么简单?对于数位长度相等的整数,的确如此。数位不等的情况不好打理,我屡试不爽,怎么修改代码,都有遗漏的情况。
  经过枚举举证,仔细观察规律,就是找不到一个通用的算法模型,对长度不一的整数进行遍历比对,判其小大。在推敲过程中,用上了把整数整成字符串的方法,遍历逐位比较int(string)数字大小,比较顺手。

代码


def isbig(num, num2):
    ''' 判定两个整数顺序拼接出最大整数 '''
    a, b = str(num), str(num2)

    if num < num2:
        n = len(a)
    else:
        n = len(b)
        
    for i in range(n):

        if int(a[i]) > int(b[i]):
            return True
        else:
            return False

“判断两个长度不同(数位不等)的整数能否顺序拼接成最大的一个整数”算法诞生记——算法学习笔记_第1张图片
在这里插入图片描述
67 6
63 6
两组整数,得出了一样的结果。63 6显然应该是False,这只遍历比较数位少的“算法”是行不通的。如果按长的整数遍历数位,长的后面的数位都与末位相比。那把短整数未重复,使长度一样,遍历比对哩。试试……

代码


    if (n1 := len(a)) > (n2 := len(b)):
        b += b[-1]*(n1-n2)
    else:
        a += a[-1]*(n2-n1)

“判断两个长度不同(数位不等)的整数能否顺序拼接成最大的一个整数”算法诞生记——算法学习笔记_第2张图片
“判断两个长度不同(数位不等)的整数能否顺序拼接成最大的一个整数”算法诞生记——算法学习笔记_第3张图片
“判断两个长度不同(数位不等)的整数能否顺序拼接成最大的一个整数”算法诞生记——算法学习笔记_第4张图片
  好像对了,但66 6却,哪个在前都是一样。但却来了个None。

    if a == b: #拼成数位一致后的比较。
        return True

加上一行代码。看看……

在这里插入图片描述
在这里插入图片描述
  数字相同,任意前后都是一样,我都令其为True。

随机10组整数:

/sdcard/qpython $ python 1026.py
1 5
1, 5, is False
8 7
8, 7, is True
16 55
16, 5, is False
41 44
41, 4, is False
8 6
8, 6, is True
37 44
37, 4, is False
800 545
80, 545, is True
555 365
5, 365, is True
487 777
487, 7, is False
956 869
956, 869, is True

再炼10组整数

/sdcard/qpython $ python 1026.py
1700 1823
170, 1823, is False
9801 2433
9801, 243, is True
16666 50545
16, 50545, is False
42222 15866
42, 15866, is True
1133 4713
113, 4713, is False
74889 91111
74889, 91, is False
51981 47988
51981, 4798, is True
47777 14138
47, 14138, is True
9667 4388
9667, 438, is True
70700 26111
70700, 261, is True

  用拉长短整数的办法解决了遍历比对数位的问题,完成了两个整数顺序拼接是否最大的判定。


回页首

mypycolor完整源码(源码较长,点此跳过源码)

#!/sur/bin/nve python
# coding: utf-8

'''

Author:梦幻精灵_cq

date:2022-10-26

'''

def random_nums(n, f=1, b=3):
    ''' 随机数列生成,n数列元素,k每数字最大位数 '''
    from random import choices, shuffle
    
    digits = list('0987654321')
    tem = []
    position = list(range(f, b+1))

    for i in range(n):
        shuffle(position)
        k = choices(position, k=1)

        while True:
            shuffle(digits)
            num = choices(digits, k=k[0])
            if num[0] != '0':
                break
        
        tem.append(int(''.join(num)))

    return tem


def isbig(num, num2):
    ''' 判定两个整数顺序拼接出最大整数 '''
    a, b = str(num), str(num2)

    if (n1 := len(a)) > (n2 := len(b)):
        b += b[-1]*(n1-n2)
    else:
        a += a[-1]*(n2-n1)

    if a == b: #拼成数位一致后的比较。
        return True
        
    for i in range(len(a)):
        if int(a[i]) > int(b[i]):
            return True
        elif int(a[i]) < int(b[i]):
            return False

if __name__ == '__main__':
    for i in range(10):
        nums =  list(map(str, random_nums(2, 2, 5)))
        m, n = nums[:2]
        print(f"{m}, {n}, is {isbig(m, n)}")



回页首

__上一篇:__ 将n个短长不一的整数拼接成一个最大的整数

__下一篇:__ 

我的HOT博:

    • New:给定字符串提取姓名(字符串、list、re“零宽断言”)(1051阅读)
    • New:我的 Python.color() (Python 色彩打印控制)(1125阅读)
    • New:python清屏(1290阅读)
    • 回车符、换行符和回车换行符(1322阅读)
    • Linux 脚本文件第一行的特殊注释符(井号和感叹号组合)的含义(1171阅读)
    • pandas 数据类型之 Series(1224阅读)
    • 聊天消息敏感词屏蔽系统(字符串替换 str.replace(str1, *) )(1270阅读)
    • 练习:银行复利计算(用 for 循环解一道初中小题)(1188阅读)
    • pandas 数据类型之 DataFrame(2136阅读)
    • :班里有人和我同生日难吗?(蒙特卡洛随机模拟法)(2180阅读)
    • Python字符串居中显示(2359阅读)
    • 练习:求偶数和、阈值分割和求差( list 对象的两个基础小题)(1665阅读)
    • 用 pandas 解一道小题(2007阅读)
    • 可迭代对象和四个函数(1083阅读)
    • “快乐数”判断(1252阅读)
    • 罗马数字转换器(构造元素取模)(2159阅读)
    • Hot:罗马数字(转换器|罗生成器)(4750阅读)
    • Hot:让QQ群昵称色变的代码(36654阅读)
    • Hot:斐波那契数列(递归| for )(4071阅读)
    • 柱状图中最大矩形(1663阅读)
    • 排序数组元素的重复起止(1258阅读)
    • 电话拨号键盘字母组合(1402阅读)
    • 密码强度检测器(1986阅读)
    • 求列表平衡点(1837阅读)
    • Hot: 字符串统计(4308阅读)
    • Hot:尼姆游戏(聪明版首发)(3493阅读)尼姆游戏(优化版)(1175阅读)
    • 推荐条件 点阅破千

      回目录


      老齐漫画头像

      精品文章:

      • 好文力荐:《python 完全自学教程》齐伟书稿免费连载
      • OPP三大特性:封装中的property
      • 通过内置对象理解python'
      • 正则表达式
      • python中“*”的作用
      • Python 完全自学手册
      • 海象运算符
      • Python中的 `!=`与`is not`不同
      • 学习编程的正确方法

      来源:老齐教室


      回目录

      Python 入门指南【Python 3.6.3】


      好文力荐:

      • 全栈领域优质创作者——寒佬(还是国内某高校学生)好文:《非技术文—关于英语和如何正确的提问》,“英语”和“会提问”是学习的两大利器。

      • 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛

      • 靠谱程序员的好习惯


      CSDN实用技巧博文:

      • 8个好用到爆的Python实用技巧
      • python忽略警告
      • Python代码编写规范
      • Python的docstring规范(说明文档的规范写法)

    你可能感兴趣的:(笔记,算法,python,算法)