03 把字符串转换成整数 04有重复字符串的排列组合

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(''))
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值