每日一学
if (num.length() == k) return "0"; StringBuilder s = new StringBuilder(num); for (int i = 0; i < k; i++) { int idx = 0; for (int j = 1; j < s.length() && s.charAt(j) >= s.charAt(j - 1); j++) idx = j; s.delete(idx, idx + 1); while (s.length() > 1 && s.charAt(0) == '0') s.delete(0, 1); } return s.toString();
别个几行代码,我他妈几十行还没搞完
。。。要不是报错还能更离谱。。
1 //小儿脑瘫做法 2 3 /** 4 * 给你一个以字符串表示的非负整数 num 和一个整数 k 5 * 移除这个数中的 k 位数字 6 * 使得剩下的数字最小 7 * 请你以字符串形式返回这个最小的数字 8 */ 9 10 public class Solution402 { 11 public String removeKdigits(String num, int k) { 12 // 先讨论特殊情况 13 String a = "0"; 14 if(k>=num.length()) 15 { 16 17 return a; 18 } 19 // 将num的值赋值给arr 20 char[] arr = num.toCharArray(); 21 char[] arr1 = new char[num.length()-k]; 22 // 设置一个flag来记录消掉的数的个数 23 int flag =0; 24 // 循环数组当出现后一个数比前一个数小的时候将前面那个数给消去。。 25 int j = 0,op = 0; 26 for (int i = 0; i < num.length(); i++) { 27 28 if (j>=arr1.length) { 29 break; 30 } 31 if (i==num.length()-1) { 32 arr1[j] = arr[i]; 33 break; 34 } 35 if(flag<k) 36 { 37 while (arr[i]>arr[i+1]) 38 { 39 i++; 40 flag++; 41 // 1432219 42 if (flag >= k) { 43 break; 44 } 45 } 46 } 47 if (j == 0&&arr[i]=='0') { 48 op++; 49 continue; 50 } 51 52 arr1[j] = arr[i]; 53 j++; 54 } 55 int i = 0; 56 char[] arr2 = new char[arr1.length-op]; 57 for (i = 0; i < arr1.length - op; i++) { 58 arr2[i] = arr1[i]; 59 } 60 String fin = new String(arr2); 61 if (fin.length() > 0) { 62 return fin; 63 } 64 else { 65 return a; 66 } 67 68 } 69 }
最后还是使用特殊方法高算了
经过实验慢慢的感觉懂了点哈
// 采取实验 String a = "hello word"; // 其实就是将一个string类型的数据转换成 StringBuilder b = new StringBuilder(a); // 随意加数据 b.append('h'); // 将该下标下的字符改成指定的字符 b.setCharAt(1,'o'); System.out.println(b); // 删除指定位置的数据,测试显示删除的范围为[a,b) b.delete(1,2); System.out.println(b); }
蓝桥。。
if (num.length() == k) return "0"; StringBuilder sb = new StringBuilder(num); // 遍历指针· int i = 0; // 找出所有的降序对并删除降序对的前面一个数字 while (k > 0) { // 遍历到s最后一个,但是k>0,说明k>降序对的对数 // 此时sb全部都是升序,删掉最后的部分就可以使得结果最小 if (i >= sb.length() - 1) return sb.substring(0, sb.length() - k); if (sb.charAt(i) > sb.charAt(i + 1)) { // 1.s[i]与s[i+1]成降序对 sb.deleteCharAt(i); // 成功删掉一个数字 k--; // i指针回退至i-1,以便比较s[i-1]与新的s[i] if (i > 0) i--; } else { // 2.s[i]与s[i+1]不成降序对 // 直接后移一位看下一个数字对 i++; // 由于没有删除字母,不影响k与产生前缀0,因此跳过后面的环节 continue; } // 每当删除掉一个数字后都要检查一下是否有前导0,有则删掉 // 这里i指针不用回退,因为只有删除了s[0]的数字a,且后面紧跟0才有可能产生前导0 // 因此现在i指针必定是0,下一次遍历的就是首个去除前导0的降序对,没必要再回退 while (sb.length() > 0 && sb.charAt(0) == '0') sb.deleteCharAt(0); // 删除所有前导0后,若k>=目前sb位数,说明不够删了,直接返回0 if (k >= sb.length()) return "0"; } // 删除完k次在这里输出 return sb.toString();
这是最后的代码,真确滴。
还添加了一个牛皮的删除指定位置的函数
.deleteCharAt()
在指定的位置后面添加数据
感谢阅读
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决