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號