贪心算法实例:将n个短长不一的整数拼成一个最大整数——算法学习笔记

2023-11-06 22:20

本文主要是介绍贪心算法实例:将n个短长不一的整数拼成一个最大整数——算法学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


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

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



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

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


等风来,不如追风去……

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

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



贪心算法实例:将n个短长不一的整数
拼接成一个最大整数
(——算法学习笔记)


今日学习《趣学算法第二版》内容:

2.1 [贪心算法基础]
2.1.1 [贪心算法本质]
2.1.2 [贪亦有道]
2.1.1 [问题分析]
 a、贪心选择
 b、最优子结构
2.1.3 [贪心算法秘籍]

 a、贪心策略,根据求解目标的不同,贪心策略也不同。
 b、求解过程,根据贪心策略,一步步得到最优解。



  贪心算法个人学习理解,最大的难点在于制定贪心策略。贪心策略不当,可能导致问题的解不是最优或无限逼近最优;甚至是让问题不适用贪心算法解答。

题目

[最大整数]设有n个正整数,将它们连接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343,连成的最大整数为34331213。
又如:n=4时,4个整数7,13,4,246,连成的最大整数为7424613。
输入:n
N个数
输出:连成的多位数

题目分析
  一个整数,高位数字大即大。要把几个整数拼成最大的整数,就得把最高位数字大的拼在前面。基于这直接把数字接最高位数字排序,最后直接拼接输出就好。出于最后输出拼接方便,先把数字转成字符。

    nums.sort(key=lambda x: x[0], reverse=True)

  用list.sort方法对n个整数排逆序(reverse参数为True)。得检验检验,贪心算法策略得检验无误才可使用。

在这里插入图片描述
  很显然,第一组“63 6 5 6”,出了“意外”。66635比63665更大,贪心策略还需改进。只考虑每个整数的首位,还有首位相同的情况,则需第二位来决断。整数数位短长不一,也不可以直接以整数较大小。经观察,首位相同,第二位大的就排前,但如65 6这样子的两个整数,以第二数位定短长的策略失效。那,此问题是不是不适用贪心算法?不忙定论,先修正贪心策略试试。看来用单行lambda匿名函数制定的排序规则还太简陋,得重新定制。

  很花费了些工夫打磨出了自己的比较“大小”的代码,经反复试炼,好像“没毛病”。她的“诞生”,另作笔记记录。(点击此处跳转查看详情])

代码


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 Truefor i in range(len(a)):if int(a[i]) > int(b[i]):return Trueelif int(a[i]) < int(b[i]):return False

用“冒泡”定制mysort


def mysort(nums):''' 按自定规则冒泡 '''for i in range(len(nums)-1, 0, -1):n = len(nums)-1while n:if not isbig(nums[n-1], nums[n]):nums[n-1], nums[n] = nums[n], nums[n-1]n -= 1

  刀已磨快!那就上山砍柴呗😄那就先用出前面出意外“ 63 6 5 6 ”祭刀!👀

代码

if __name__ == '__main__':nums = [63, 6, 5, 6]print(f"{len(nums):3}个整数:", end='')print(*nums)mysort(nums) # 调用“冒泡”逆序。print(f"排逆序:", end='')print(*nums)print(f"拼成最大整数:{''.join(map(str, nums))}")

在这里插入图片描述
OK✌
  这就对了!“ 66635 ”,最大的整数。🤗🤗再用题目中的例子数组炼炼。

在这里插入图片描述
依旧OK✌👀😁😁😁


  多用些数组来炼炼,检证一下。自己写数组,难得整。😣代码对重复的简单琐事不嫌麻烦,请她上场。随机任意长短整数数组皆可定制,个数n,长度默认1~3位亦可自行设定。

代码


def random_nums(n, f=1, b=3):''' 随机数列生成,n数列元素,k每数字最大位数 '''from random import choices, shuffledigits = 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':breaktem.append(int(''.join(num)))return tem

工作代码


if __name__ == '__main__':nums =  list(map(str, random_nums(6, 1, 3)))print(f"{len(nums):3}个整数:", end='')print(*nums)mysort(nums)print(f"排逆序:", end='')print(*nums)print(f"拼成最大整数:{''.join(map(str, nums))}")

试炼效果截屏图片
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  全部检证数组,成功拼接出最大整数!这小小的成功,虽然让“基础不牢”的我绞尽脑汁,但还是收获了一份满满的喜悦。虽然看起来算法丑且繁,也许以后,我可以优化呢。
  虽然探寻贪心策略之路有些艰辛,但让有人怀疑不可以用贪心算法解的这道小题,用贪心算法出解,也是欣慰。


回页首

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

#!/sur/bin/nve python
# coding: utf-8'''Author:梦幻精灵_cqdate:2022-10-24'''def random_nums(n, f=1, b=3):''' 随机数列生成,n数列元素,k每数字最大位数 '''from random import choices, shuffledigits = 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':breaktem.append(int(''.join(num)))return temdef 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)for i in range(len(a)):if int(a[i]) > int(b[i]):return Trueelif int(a[i]) < int(b[i]):return Falsedef mysort(nums):''' 按自定规则冒泡 '''for i in range(len(nums)-1, 0, -1):n = len(nums)-1while n:if not isbig(nums[n-1], nums[n]):nums[n-1], nums[n] = nums[n], nums[n-1]n -= 1if __name__ == '__main__':nums =  list(map(str, random_nums(6, 1, 3)))nums = [13, 312, 343]nums = [7, 13, 4, 246]#nums = [63, 6, 5, 6]m, n = 44, 44#input(f"{m}, {n}, is {isbig(m, n)}")print(f"{len(nums):3}个整数:", end='')print(*nums)mysort(nums)print(f"排逆序:", end='')print(*nums)print(f"拼成最大整数:{''.join(map(str, nums))}")

回页首

__上一篇:__ 神奇的兔子数列-算法学习笔记

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

我的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规范(说明文档的规范写法)

    这篇关于贪心算法实例:将n个短长不一的整数拼成一个最大整数——算法学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



    http://www.chinasem.cn/article/359385

    相关文章

    前端原生js实现拖拽排课效果实例

    《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

    Java深度学习库DJL实现Python的NumPy方式

    《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

    mysqld_multi在Linux服务器上运行多个MySQL实例

    《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

    Java function函数式接口的使用方法与实例

    《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

    java图像识别工具类(ImageRecognitionUtils)使用实例详解

    《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

    Java操作ElasticSearch的实例详解

    《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

    使用C#代码计算数学表达式实例

    《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

    Python中的随机森林算法与实战

    《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

    Oracle Expdp按条件导出指定表数据的方法实例

    《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

    如何提高Redis服务器的最大打开文件数限制

    《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制