我要失业了 Day 1 剑指Offer 5.替换空格

受疫情影响只能宅家,没有实验室的氛围完全成为一条咸鱼,小论文交给老师也没有恢复,今天开始记录剑指offer的刷题过程。
喵的,这道题肝了快2小时了,本来很简单的一道题,力扣上的字符串有空间限制,一越界就会报错,最后用了一个resize才解决的。
先看题目:
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例 1:
输入:s = “We are happy.”
输出:“We%20are%20happy.”

这道题用的思路是从后向前重写字符串,这里需要先统计一下字符串长度和空格的数量,用一个while循环就能解决,字符串结尾是’\0’符号,看到它就停止计数,也可以用一个for循环解决,反正用s.size()和s.length都可以获得字符串长度。之后计算重写后需要多少空间,重写后=重写前+2*空格数,这个问题要想明白。
然后申明两个指针,指针1指向重写前最后一位,指针2指向重写后最后一位,正常情况下每循环一次两个指针都左移1格,并将指针1的值赋给指针2,当指针1指向空格以后,指针1 先左移1下,再将’0’、‘2’、’%'分别写入指针2并左移3次,当两个指针下标相同时就算完成了。
代码如下:

class Solution {
public:
    string replaceSpace(string s) {
        
        int num_space = 0;
        int length_1 = 0;
        
        int i = 0;
        while(s[i] != '\0')
        {
            if (s[i] == ' ')
            num_space++;
            length_1++;
            i++;
        }
      
        cout<<num_space<<endl;
        cout<<length_1<<endl;
        int length_2 = length_1 + 2*num_space;
        cout<<length_2<<endl;
        s.resize(length_2);
        while(length_1>=0 &&length_2>length_1)
        {
            if (s[length_1] == ' ')
            {
                cout<<'a'<<length_2<<'\t'<<length_1<<endl;
                
                s[length_2] = '0';
                cout<<s[length_1]<<'\t'<<s[length_2]<<endl;
                length_2--;
                s[length_2] = '2';
                cout<<s[length_1]<<'\t'<<s[length_2]<<endl;
                length_2--;
                s[length_2] = '%';
                cout<<s[length_1]<<'\t'<<s[length_2]<<endl;
                length_2--;
                
                length_1--;
                
            }
            else 
            {
                cout<<'b'<<length_2<<'\t'<<length_1<<endl;
                
                s[length_2] = s[length_1];
                length_2--;
                length_1--;
                cout<<s[length_1]<<'\t'<<s[length_2]<<endl;
                
                
            }
            
        }
        return s;
    }
    
};

需要注意的是:
双指针的方法在力扣很经典,要学会用;
字符串是以’\0’结尾;s.size()和s.length()可以计算长度
如果不想越界,就用resize函数扩展边界,之前还想到再声明一个字符串,但是它非要我声明尺寸,神烦!浪费我好多时间。
刷题就是积累解题经验的过程,奥利给!
晚上争取再肝一道。

发布了3 篇原创文章 · 获赞 0 · 访问量 15

猜你喜欢

转载自blog.csdn.net/qq_41227231/article/details/105664624