网站开发待遇如何,文化书院网站建设方案,微信电商小程序开发公司,网站开发过程中的功能需求分析前言
字符串是我们在日常开发中最常处理的数据#xff0c;虽然它本身不是一种数据结构#xff0c;但是由于其可以包含所有信息#xff0c;所以通常作为数据的一种形式出现#xff0c;由于不同语言创建和管理字符串的方式也各有差异#xff0c;因此针对不同语言特征又产生…前言
字符串是我们在日常开发中最常处理的数据虽然它本身不是一种数据结构但是由于其可以包含所有信息所以通常作为数据的一种形式出现由于不同语言创建和管理字符串的方式也各有差异因此针对不同语言特征又产生了很多问题。
常见的字符串转换题目也就是在大小写字母、数字、特殊字符这几种类型之间进行。但是在转换过程中需要处理几种特殊情况比如当前元素能否进行转换如果是字符串转换为数字还要考虑当前元素是不是数字转换之后是否会溢出等。
1.转换成小写字母
力扣709题给你一个字符串 s 将该字符串中的大写字母转换成相同的小写字母返回新的字符串。
分析在计算机中每个字符都有相应的ASCII码。我们可以根据码表操作字符串常见的ASCII码范围
0-9 48-57
A-Z 65-90
a-z 97-122遍历整个字符串对每一位字符串加以判断如果字符串的编码值在65-90之间就需要在原来了的ASCII值上利用按位或运算| 32就可以转换为对应小写。
代码如下
// 使用内置函数
function toLowerCase(s) {return s.toLowerCase();
}// 自行实现
let toLowerCase function (s) {const res [];for (let charOfWord of s) {if (charOfWord.charCodeAt() 65 charOfWord.charCodeAt() 90) {// 使用按位或位运算表示加法charOfWord String.fromCharCode(charOfWord.charCodeAt() | 32);}res.push(charOfWord);}return res.join();
};
2.字符串转换为整数atoi
力扣8题请你来实现一个 myAtoi(string s) 函数使其能将字符串转换成一个 32 位有符号整数类似 C/C 中的 atoi 函数。
函数 myAtoi(string s) 的算法如下
读入字符串并丢弃无用的前导空格检查下一个字符假设还未到字符末尾为正还是负号读取该字符如果有。 确定最终结果是负数还是正数。 如果两者都不存在则假定结果为正。读入下一个字符直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。将前面步骤读入的这些数字转换为整数即“123” - 123 “0032” - 32。如果没有读入数字则整数为 0 。必要时更改符号从步骤 2 开始。如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] 需要截断这个整数使其保持在这个范围内。具体来说小于 −231 的整数应该被固定为 −231 大于 231 − 1 的整数应该被固定为 231 − 1 。返回整数作为最终结果。
注意
本题中的空白字符只包括空格字符 。除前导空格或数字后的其余字符串外请勿忽略 任何其他字符。
分析 参考Gatsby/力扣官方 这里用到了自动机的解法用图来表示 用表格来表示
’ (空格)/-Number其它startstartsignedin_numberendsignedendendin_numberendin_numberendendin_numberendendendendendend
代码如下
/*** param {string} s* return {number}*/
var myAtoi function(s) {// 自动机类class Automaton {constructor() {// 执行阶段默认是开始阶段this.state start;// 正负符号默认是正数this.sign 1;// 数值默认是0this.answer 0;/*关键点状态和执行的阶段的对应表含义[执行阶段, [空格], [正负号], [数值], [其它]]*/this.map new Map([[start,[start, signed, in_number, end]],[signed, [end, end, in_number, end]],[in_number, [end, end, in_number, end]],[end, [end, end, end, end]],]);}// 获取状态的索引getIndex(char) {if (char ) {return 0;} else if (char - || char ) {return 1;} else if (isNumeric(char)) {return 2;} else {return 3;}}/*关键点字符转换执行函数*/get(char) {const MIN_VALUE -Math.pow(-2, 31);const MAX_VALUE Math.pow(2, 31) - 1;/*易错点每次传入字符都要变更自动机的执行阶段*/this.state this.map.get(this.state)[this.getIndex(char)];if (this.state in_number) {/*小技巧在JS中对字符串类型做减法操作可以得到一个数值型Number的值易错点本处需要利用括号来提高四则运算的优先级*/this.answer this.answer * 10 (char - 0);// 易错点在进行负数比较时需要将INT_MIN变为正数this.answer (this.sign 1 ? Math.min(this.answer, MAX_VALUE) : Math.min(this.answer, MIN_VALUE));} else if (this.state signed) {/*优化点对于一个整数来说非正即负所以正负号的判断只需要一次。所以可以降低其判断的优先级*/this.sign (char ? 1 : -1);}}}// 判断传进来的字符串是不是数字function isNumeric(s) {return /^-?\d(\.\d)?$/.test(s);}// 生成自动机实例let automaton new Automaton();// 遍历每个字符for (let char of s) {// 依次进行转换automaton.get(char);}// 返回值整数 正负 * 数值return automaton.sign * automaton.answer;
};在判断传入的字符是不是数字时最好用正则表达式来判断这样比较准确。
用typeof Number(char) number和!isNaN(char)都不太合理
typeof Number(char) number: 这部分判断使用了typeof操作符它会将Number(char)的结果判定为number。然而Number(char)在转换无法转换为有效数字的字符串时会返回NaN而typeof NaN也是number因此这部分判断并不能准确地判断传入的字符串是否是一个有效的数字。!isNaN(char): 这部分判断使用了isNaN函数它用于检查一个值是否为NaN。然而isNaN函数在判断非数字类型的值时也会返回false比如空字符串、布尔值、对象等。这也就意味着如果传入的是非数字但却不是NaN的值这部分判断同样会得出错误的结论。