1.把字符串转换成整数
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。
说明:
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
IPO
I:输入一个字符串str
P:
(1)将字符串两边的空格去掉
(2)转化为整型
(3)如果是NAN直接返回0;否则判断是否小于最小或者是大于最大的值,直接返回最小或者最大值;通过以上的条件,直接返回该数值
O:0或者最小值或者最大值或者该数值
/**
* @param {string} str
* @return {number}
*/
var strToInt = function(str) {
var str1=str.trim()
let res=parseInt(str1)
if(isNaN(res)) return 0
let min=Math.pow(-2,31)
let max=Math.pow(2,31)-1
if(res<min) return min
if(res>max) return max
return res
};
2.有重复字符串的排列组合。
编写一种方法,计算某字符串的所有排列组合
示例1:
输入:S = "qqe"
输出:["eqq","qeq","qqe"]
示例2:
输入:S = "ab"
输出:["ab", "ba"]
提示:
字符都是英文字母。
字符串长度在[1, 9]之间。
IPO过程
I:输入一个字符串
P:整个过程我们可以先用常规的思想,我们需要对其进行排列组合,那么我们选择的第一个数是字符串中不重复的字符,如上例我们应该选择的是e和q;接下来我们应该是选择除了第一步选择的数之外的数,接下来的选择又有多种选择。
第一步 | 第二步 |
---|---|
选择e | 选择q |
选择e | |
选择q | 选择e |
选择q | 选择q |
由此,如果我们在选择的时候,后面两个的数是相同的,我们就可以直接跳过这个循环,(前提是已经排好序)
用stack表示已选中的序列,store表示每次未被选择的序列。
(1)先将字符串转为数组并进行排序
(2)调用递归函数,传递两个参数,stack表示被选中的,store表示未被选中的,第一次调用的时候,stack为空,store为原数组
(3)采用循环遍历,将数组中的元素取出来放在第一位,(如果两次取出来的结果是一样的,那就跳过该循环),track.push(store[i])
(4)在循环过程中,利用递归,将track和store作为参数递归调用该函数,才是track为被选中的序列,store为未被选中的序列
O:输出一个包含所有情况的字符串数组
var permutation = function(S) {
let arr = S.split('').sort()
let res = []
function backtrack(track, store) {
//递归出口
if (store.length === 0) {
res.push([...track]);
return;
}
// 只需要循环未遍历的元素集合
for (let i = 0; i < store.length; i++) {
// 如果该元素和上一次遍历的元素重复则跳过
if (store[i] === store[i - 1]) continue;
//选中改元素
track.push(store[i]);
//递归调用,track为被选中的序列,store为未被选中的序列
backtrack(track,store.filter((_,idx)=>idx !== i));
//将该元素从track中弹出,继续选择下一个循环的序列
track.pop();
}
}
backtrack([], arr)
return res.map(item => item.join(''))
};