算法学习——贪心算法之删数字(求最大值)
2023-02-18 16:36:58 时间
算法描述
在给定的n位数字,删除其中的k位数字( k < n),使得最后的n-k为数字为最大值(原次序不变)
算法思路
-
考虑到是要移出数字,我们使用链表设计此算法较为方便,链表可以直接移出某个位置的元素
-
使用贪心算法,每一步都要达到最优
-
从最高位开始,若是下一位比上一位大,则比上一位的数字移出,结束之后再次从最高位开始
例如 16489657 删除4个数字
首先比较1和6 删除1 得到 6489657
之后,再次比较 6和4 往后推 可得到 689657
以此类推 删除4个数字之后 可得到 9657
这里会有个特殊情况,当一个从大大小的整数输入的时候,我们得从末尾删除数字才能得到最大值
例如 98765 删除5 可以得到最大值 9876
算法实现
Scanner scanner = new Scanner(System.in);
System.out.println("请输入整数:");
String s = scanner.nextLine();
System.out.println("删除数字的个数:");
int n = scanner.nextInt();
scanner.close();
int a[] = new int[s.length()];
for(int i=0;i<s.length();i++){
char temp =s.charAt(i);
a[i] = temp -'0';//不减去‘0’则会获得Ascii码
}
LinkedList<Integer> linkedList = new LinkedList<Integer>();
for(int i=0;i<a.length;i++){
linkedList.add(a[i]);
}
int flag =0;
while(flag<n){
for(int i=0;i<linkedList.size()-1;i++){
if(linkedList.get(i)<linkedList.get(i+1)){
linkedList.remove(i);//使用链表移出元素
flag++;
break;//结束本次循环,跳转到while循环中
}
//考虑到特殊情况,当遍历完全部数字都不满足条件,从末尾删除数字
if(i==linkedList.size()-2){
linkedList.removeLast();
flag++;
}
}
}
System.out.print("截取的"+n+"个数字后的最小值为");
for(int i=0;i<linkedList.size();i++){
System.out.print(linkedList.get(i));
}
结果
相关文章
- php使用redis实现消息队列实例
- Kubernetes命令行工具 - kubectl用法总结
- 一键安装高可用Kubernetes集群的工具,支持本地环境和云环境
- 云原生钻石课程 | 第7课:Kubernetes 网络架构原理深度剖析(下)
- 虚实相生,构建数智生活|HMS Core. Sparkle应用创新分论坛报名启动
- 报名启动丨HMS Core. Sparkle应用创新论坛
- 中文主播也能海外带货!同声传译助直播类应用开拓海外市场
- HMS Core 机器学习服务打造同传翻译新“声”态,AI让国际交流更顺畅
- 无密码身份验证如何保障用户隐私安全?
- 【FAQ】华为帐号服务报错 907135701的常见原因总结和解决方法
- 华为HMS Core携手超图为三维GIS注入新动能
- HMS Core音频编辑服务3D音频技术,助力打造沉浸式听觉盛宴
- 华为帐号多端协同,打造美好互联生活
- HMS Core打造影音娱乐行业解决方案,助推视听新浪潮
- 运动App如何实现端侧后台保活,让运动记录更完整?
- 品质影音体验,畅享娱乐生活丨HMS Core.Sparkle影音娱乐创新线上沙龙报名启动
- HMS Core机器学习服务实现同声传译,支持中英文互译和多种音色语音播报
- 华为机器学习服务语音识别功能,让应用绘“声”绘色
- 影音娱乐应用开发,这些关键词请查收
- 在线文本实体抽取能力,助力应用解析海量文本数据