Ninth Week‘s ARST

ARST

Algorithm: 每周一道Leetcode
Review: 每周阅读并点评至少一篇英文技术文章
Tip: 每周学习技术技巧
Share: 每周分享一篇有观点和思考的技术文章

A

Leetcode394——Decode String
题目要求
Given an encoded string, return it’s decoded string.
The encoding rule is: k[encoded_string], where the encoded_string inside the square brackets is being repeated exactly k times. Note that k is guaranteed to be a positive integer.
You may assume that the input string is always valid; No extra white spaces, square brackets are well-formed, etc.
Furthermore, you may assume that the original data does not contain any digits and that digits are only for those repeat numbers, k. For example, there won’t be input like 3a or 2[4].
Examples:

s = "3[a]2[bc]", return "aaabcbc".
s = "3[a2[c]]", return "accaccacc".
s = "2[abc]3[cd]ef", return "abcabccdcdcdef".

C++编写

class Solution {
public:
    string decodeString(string s) {
        string m = "";       //用于记录字符串
        stack<int> s_num;          //创建一个栈来保存遍历到的数字
        stack<string> s_str;       //创建另一个栈来保存字符串
        int sn = 0;       //用于记录数字
        for (int i = 0; i < s.size(); ++i) 
        {
            if (s[i] >= '0' && s[i] <= '9') 
            {
                sn=10 *sn+s[i]-'0';   //得到s中的数字
            } 
            else if (s[i] == '[')   
            /*遍历到左括号,则把数字sn压入栈中,
             *同时清空sn,用于记录下一个数字
             *同时也把之前记录的字符串压入栈中
             *用于之后的字符串相加操作
             */
            {
                s_num.push(sn);
                s_str.push(m);
                sn=0; 
                m.clear();
            } 
            else if (s[i] == ']') 
            /*遍历到右括号,则把栈中顶层数字取出来
             *开始进行解码操作
             */
            {
                int k = s_num.top(); 
                s_num.pop();
                for (int j = 0; j < k; ++j) 
                {
                    s_str.top() += m;
                }
                m = s_str.top(); 
                s_str.pop();
            } 
            else 
            /*记录字符串*/
            {
                m += s[i];
            }
        }
        return m;
    }
};

疑难解答: 整个代码基本上是没什么问题的,但是第12行sn=10 *sn+s[i]-'0'可能会有些让人看不懂,这个会在下方进行解答

R

加速Windows 10的11个技巧
虽然现在随着PC硬件的不断发展,软件也越来越快,Windows 10也不例外。但是人们总是会感觉不够快,并且时间越长越来越慢、越来越卡,按照寿命来说这是正常的,但是如果减速太严重,那肯定是不符合实际的,这表明你的Windows10需要加速了,这篇文章详细的介绍了11个加速技巧,有些比较常见的,当然也有些可能是我们不知道的。看完这篇文章想必多少会对你加速有所帮助。

S

前面疑难解答处提到一个问题,这同时也是这周的收获,先进行一个分析对比
原本的正确代码:

sn=10 *sn+s[i]-'0';

测试结果如下,完全没问题
在这里插入图片描述
小改动之后的代码:

sn=10 *sn+s[i];

在这里插入图片描述
可以看出就稍微做了一点改动就出了大问题,这是为什么呢,下面来解释一下
显然我们用来记录数字的sn需要得到的是一个数字,但是s是一个字符串,其中的数字也是字符串的形式,那么要将其字符串形式转化为int的数字,那么用是s[i]-'0'这个方式就可以得到,下面来说一下为什么这样可行,以及分析一下它的机制

sn=10 *sn+s[i]这句代码其实是指整数sn*10加上s[i],加的是s[i]的ASCII码值,那么减去字符0,也就是减去0的ASCII码值48,数字字符减去’0’就得到了该数字,下面再举个例子帮助理解

int i,x[4];
char str[]="1234";
for (i=0;i<4;i++)   x[i] = str[i] - '0';

那么最终整型数组x中就保存了整形数字1234

T

这学期C++书本上教的东西烦乱而驳杂,容器作为一个关键的东西都没怎么提及,通过这几周我也发现会使用容器都自己写代码会带来很大的帮助,而且这也是个重要的内容,推荐两篇讲述容器的文章
浅谈C++容器
C++ STL基本容器使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值