代码改变世界

java小算法实现-长整形去除重复保留最小值

  杰啦  阅读(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 }
复制代码

如有不正确或者更好的解题思路,可以联系我

    

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示