每日一学

复制代码
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()

在指定的位置后面添加数据

 

 感谢阅读

posted @   湖南陈冠希  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示