java小算法实现-长整形去除重复保留最小值
2019-07-20 16:55 杰啦 阅读(546) 评论(0) 编辑 收藏 举报最近遇到需要写一些题目的实现,遇到一个比较头疼的问题,给定一个字符串,怎么删除重复数字并保证得到的结果最大
例如:423234 最大值432
本人的解题思路如下:
1.将长整形赋值给字符串数组,然后依据一定的规律去删除数组重复的数字
2.规律如下
假设当前数值为a,下一个数值为b
当前数值与后续字符串数值逐个比较,如果没有重复数字,就直接保留到结果数组上
当前数值与后续字符串数值逐个比较,如果有重复数字,则需要进行判断,
1.a>b,则将其后面遇到的第一个a值转变成‘n’
2.a<=b,则将自身数值转变成‘n’
3.由于是局部替换,所以最后加了个循环来确保没有重复数字出现
1 package com.six; 2 3 import java.util.Scanner; 4 5 /** 6 * 求一串数字的删除重复后的最大值 1.求出删除重复后的字符串 2.求最大值,也即232这种情况的处理 7 * 8 * @author 99201 9 * 10 */ 11 public class DelDuplicate { 12 public static void main(String[] args) { 13 //读取一行数字 14 Scanner in = new Scanner(System.in); 15 String input = in.next(); 16 //调用delDup方法 17 StringBuilder str = delDup(input); 18 //检查生成的str是否还有重复数字 19 while (!test(str)) { 20 str = delDup(str.toString()); 21 } 22 //输出结果 23 System.out.println(str.toString()); 24 } 25 //判断字符串是否存在重复数字,存在返回false 26 public static boolean test(StringBuilder s) { 27 for (int i = 0; i < s.length(); i++) { 28 int m = in(i, i + 1, s); 29 if (m > 0) { 30 return false; 31 } 32 } 33 return true; 34 } 35 //返回局部最优解 36 public static StringBuilder delDup(String input) { 37 StringBuilder str = new StringBuilder(input); 38 //结果字符串 39 StringBuilder res = new StringBuilder(); 40 int len = str.length(); 41 //用于替换重复数字的字符 42 char N = 'n'; 43 //遍历字符串数组,从0-(len-2) 44 for (int i = 0; i < len - 1; i++) { 45 int tem = in(i, i + 1, str); 46 if (tem == 0 && str.charAt(i) != N) { 47 res.append(str.charAt(i)); 48 continue; 49 } 50 if (str.charAt(i) < str.charAt(i + 1)) { 51 if (tem > 0) { 52 str.setCharAt(i, N); 53 } 54 } else if (str.charAt(i) == str.charAt(i + 1)) { 55 str.setCharAt(i, N); 56 } else if (str.charAt(i) > str.charAt(i + 1)) { 57 if (tem > 0) { 58 str.setCharAt(tem, N); 59 } 60 } 61 //判断字符串数组最后一个数字是否有被替换 62 if (str.charAt(i) != N) { 63 res.append(str.charAt(i)); 64 } 65 } 66 if (str.charAt(len - 1) != N) { 67 res.append(str.charAt(len - 1)); 68 } 69 return res; 70 } 71 //判断给定数字在字符串中位值,返回其后第一次再出现该数字在字符串中位置 72 public static int in(int i, int j, StringBuilder str) { 73 char c = str.charAt(i); 74 for (int k = j; k < str.length(); k++) { 75 if (c == str.charAt(k)) { 76 return k; 77 } 78 } 79 return 0; 80 } 81 }
如有不正确或者更好的解题思路,可以联系我
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架