重新格式化字符串
给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母。
请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。
请你返回 重新格式化后
的字符串;如果无法按要求重新格式化,则返回一个 空字符串 。
示例 1:
输入:s = "a0b1c2"
输出:"0a1b2c"
解释:"0a1b2c" 中任意两个相邻字符的类型都不同。 "a0b1c2", "0a1b2c", "0c2a1b" 也是满足题目要求的答案。
示例 2:
输入:s = "leetcode"
输出:""
解释:"leetcode" 中只有字母,所以无法满足重新格式化的条件。
示例 3:
输入:s = "1229857369"
输出:""
解释:"1229857369" 中只有数字,所以无法满足重新格式化的条件。
解题思路
只有字符的数量相等
或者相差一个
才能使任意两个相邻字符都不相同。并且数量少的那一方必须在数量多的中间,也就是说数量多的必须要最先开始,第一个必须是数量多的
ok,重要的事情分析完了,接下来开始写具体步骤
- 第一步:定义两个数组,一个存储字符strList,一个存储数字numList,再定义一个res用于存储格式化后的字符串
- 第二步:遍历一遍字符串s,分别将每项存入对应的数组
- 第三步:判断一下数字长度与字符长度差值,如果大于1,就直接返回空字符串
- 第四步:如果小于等于1,比较一下两个数组的长度,则根据最短的数组的长度,来遍历两个数组
res += numList[i] + strList[i]
,记住第一个字符是数字 - 第五步:如果两个数组长度相同,直接返回res;如果不相同,因为第一个字符是数字,数字比字符长的话就插入到最后,短的话就插入到最前面
var reformat = function (s) { let numList = []; let strList = []; for (let i = 0; i < s.length; i++) { if (isNaN(s[i])) {//说明是字母 strList.push(s[i]) } else { // 是数字 numList.push(s[i]) } } if (Math.abs(numList.length - strList.length) > 1) return ""; let res = ""; let minLen = Math.min(numList.length, strList.length); for (let i = 0; i < minLen; i++) { res += numList[i] + strList[i]; } if(numList.length > strList.length){ res= res+numList[numList.length-1] }else if(numList.length < strList.length){ res= strList[strList.length-1]+res }else{ return res } return res; };
知识点
Math.abs(x)
函数返回指定数字x
的绝对值。