数字与字符串间转换——443、8、13

443. 压缩字符串

解法一、双指针

r只负责读,w只负责写

class Solution {
    public static int compress(char[] chars) {
        int r=0,w=0;
        int len = chars.length;
        while(r < len){
            char c = chars[r];
            int count = 1;
            r++;
            while(r < len && chars[r] == chars[r-1]){
                count++;
                r++;
            }
            String t = count + "";
            chars[w] = c;
            w++;
            if(count !=1){
                for(int i = 0;i < t.length();i++){
                    chars[w] = t.charAt(i);
                    w++;
                }
            }
        }
        return w;
    }
}

 

解法二、也是双指针

只要read是最后一位或不等于下一位,则它是连续区段最后一位。

两种方法的差别:一个是读完一个连续段就开始从前写,一个是一个一个地读写。 

对于{a,a,a,b,b,b,b,c,c,c},方法1写完是{a,3,b,4,c,3,b,c,c,c,c},方法2写完是{a,3,a,b,4,b,c,3,c}

class Solution {
    public int compress(char[] chars) {
        int n = chars.length;
        int write = 0, left = 0;
        for (int read = 0; read < n; read++) {
            if (read == n - 1 || chars[read] != chars[read + 1]) {
                chars[write++] = chars[read];
                int num = read - left + 1;
                if (num > 1) {
                    int anchor = write;
                    while (num > 0) {
                        chars[write++] = (char) (num % 10 + '0');
                        num /= 10;
                    }
                    reverse(chars, anchor, write - 1);
                }
                left = read + 1;
            }
        }
        return write;
    }

    public void reverse(char[] chars, int left, int right) {
        while (left < right) {
            char temp = chars[left];
            chars[left] = chars[right];
            chars[right] = temp;
            left++;
            right--;
        }
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/string-compression/solutions/948556/ya-suo-zi-fu-chuan-by-leetcode-solution-kbuc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

8. 字符串转换整数 (atoi)

解法一、模拟遍历

先讨论符号问题。'+'是43,‘-’是45,于是反减44 判断。while条件是该位是数字,不满足则跳出循环。while中的if讨论越界问题,如果讨论res * 10是不是超过MAX_VALUE,那么就讨论res和最大值/10的关系。若是前几位都大于,则直接返回;如果前几位都等于,最后一位大于7,也返回。

class Solution {
    public static int myAtoi(String s) {
        s = s.trim();
        int op = 0;
        int q = 0,res = 0,bndry = Integer.MAX_VALUE / 10;
        int len = s.length();
        if(len == 0)return 0;
        if(s.charAt(q)=='-' || s.charAt(q) == '+'){
            op = -(s.charAt(q) - 44);
            q++;
        }
        while(q<len && s.charAt(q)<='9' && s.charAt(q)>= '0'){
            if(res > bndry || res == bndry && s.charAt(q) > '7') return op > 0 ? Integer.MAX_VALUE :Integer.MIN_VALUE;
            res = res * 10 + s.charAt(q) - '0';
            q++;
        }
        return res;
    }
}

 

class Solution {
    public int romanToInt(String s) {
        int len = s.length();
        int sum = 0;
        for(int i = 0;i < len;i++){
            int num = change(s.charAt(i));
            if(i != len-1 && num < change(s.charAt(i+1))){
                 sum -= num;
                }else{
                    sum+=num;
                }
        }
        return sum;
    }
    private int change(char c){
        switch (c){
            case 'I':
                return 1;
            case 'V':
                return 5;
            case 'X':
                return 10;
            case 'L':
                return 50;
            case 'C':
                return 100;
            case 'D':
                return 500;
            case 'M':
                return 1000;
        }
        return 0;
    }
}

13. 罗马数字转整数

解法一、模拟遍历

其实就是,若是比右面小则减,比右面大则加,最后一位肯定加,这样的规律。想出来的话代码就好写 

class Solution {
    public int romanToInt(String s) {
        int len = s.length();
        int sum = 0;
        for(int i = 0;i < len;i++){
            int num = change(s.charAt(i));
            if(i != len-1 && num < change(s.charAt(i+1))){
                 sum -= num;
                }else{
                    sum+=num;
                }
        }
        return sum;
    }
    private int change(char c){
        switch (c){
            case 'I':
                return 1;
            case 'V':
                return 5;
            case 'X':
                return 10;
            case 'L':
                return 50;
            case 'C':
                return 100;
            case 'D':
                return 500;
            case 'M':
                return 1000;
        }
        return 0;
    }
}

 


碎碎念 

  • 学会了双指针遍历、讨论越界问题的逆向思维
  • 最近几天做得最辛苦的一天,很难想象前两道题居然一道要花一小时,直接精准破防了。

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Qt中,可以使用QString类的toInt()函数将字符串转换数字。这个函数接受一个可选的基数参数,用于指定字符串的进制。默认情况下,基数为10,表示十进制。如果需要将字符串转换为其他进制的数字,可以使用QString类的setNum()函数将数字转换字符串,并指定所需的进制。例如,要将十进制字符串转换为十六进制字符串,可以使用setNum()函数的第二个参数将基数设置为16。然后,可以使用toUpper()函数将结果转换为大写,并使用setText()函数将结果设置为控件的文本。下面是一个示例代码片段,演示了如何在Qt中实现字符串数字的功能: ```cpp void Widget::on_btnDec_clicked() { QString str = ui->editDec->text(); int val = str.toInt(); // 将字符串转换为十进制数字 str = QString::number(val, 16); // 将数字转换为十六进制字符串 str = str.toUpper(); // 将结果转换为大写 ui->editHex->setText(str); // 设置十六进制字符串到相应的控件 str = QString::number(val, 2); // 将数字转换为二进制字符串 ui->editBin->setText(str); // 设置二进制字符串到相应的控件 } ``` 注意,以上代码是一个槽函数,当按钮被点击时执行。在代码中,editDec是一个QLineEdit控件,用于输入十进制数。editHex和editBin分别是用于显示转换结果的QLineEdit控件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [初识QT(二十六)——Qt字符串数字转换方法详解](https://blog.csdn.net/qq_35789421/article/details/99436843)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值