题目链接:. - 力扣(LeetCode)
将其翻译一下:
①:如果首个字符是空格: 删除其然后让下一个字符进入②判断,反之不是空格则就该位置的字符进入②判断
②: 判断符号位: 三种情况,即 ''+'' , ''−'' , ''无符号" ,''无符号"和''+''都代表正号,只有-才代表负号,且''无符号"则就这个位置的字符继续进入③判断,反之是下一个字符进入③判断
③:如果是字符'0' ~ '9'的才算作有效的数字字符,反之则非数字字符;读到有效字符,才会继续往下读,而读到非数字字符则立即停止,且非数字字符不要了,仅要前面读到的连续的有效的数字字符
④:将读到的有效的数字字符转换为整数(即,"123" -> 123, "0032" -> 32);如果没有读入数字,则整数为
⑤:转换成整数,该整数如果大于2^31 − 1 或者 小于-2^31 ,这两种情况都要进行截断,截断就是小于 的整数应该被固定为 ,大于2^31 − 1就应该固定为
⑥:将最终的整数进行返回
代码:
解读:
①:
解释:
a:正如我们前文所说,我们用了一个bool值来进行反映正负号,假设true代表正号,下面我们判断符号如果是正号则不改变bool值,反之改变
b:接着就是进行思路中的①,这里不仅对于一个空格的跳过,更是对于("___42")这种连续空格的跳过
c:判断符号,无符号和+都不用改变bool值(因为设定的true为+),反之更改bool值为false
d:接着就是对非符号位的判断,正常数字第一个数字一定是1~9的,返回直接return 0;
②:
解释:
a: res用来不断地将存储读取到的字符转换成的整形("12" -> 12,"123" -> 123),转换规则下文会说
b:num用来保存数字字符对应的整形的值 ('6'->6),即减去'0'即可 ('6'-'0'->6)
c:border 是最关键的,其值是(2^31-1)/10 ,即整形的最大值/10,整形最大值是,所以border等于,border取INT_MAX/10才能够进行⑤(是否超出范围的判断),要理解其border的值为什么是,需要理解a中res是如何不断地存储读取到的字符转换成的整形
字符转化成整形的思路:
解释:可知,规则是res = 10 * res + num;
明白了规则,就能理解为什么board是
解释:两种越界的情况
a:第一种就是res> border会越界,因为此时其*10 一定会超过整形的最大值,假设res仅仅比border大1,为,这时*10,都是,远远大于了
b:res=boder && num>7 ,前面的res = boder ,此时res*10,值为,距离超出范围差7,所以后面的num>7才会越界
c:以上是正数的越界,那负数呢?负数的范围是-,绝对值来说的话比正数还要大于1,那为什么仅仅只判断正数就行了呢?以下分享一个力扣同学的观点:
d:最后需要注意的一点是:我们的判断越界一定要放在读取字符的后面,因为来到越界判断,就证明一定是读取到了有效数字字符,此时在越界的后面一定是要 res = res*10 +num的,所以我们的两种越界情况才能够判断,毕竟我们两种越界判断都是*10 或者 *10+num 的条件上进行的。
到此这篇转换字符串编码(编码实现字符串转整型的函数)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/haskellbc/82513.html