java小算法实现-长整形去除重复保留最小值
2019-07-20 16:55 杰啦 阅读(555) 评论(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 }
如有不正确或者更好的解题思路,可以联系我
浙公网安备 33010602011771号