反转字符串
leetcode链接:leetcode.cn/problems/re…
简单题,用双指针法,两个指针遍历着向中间收缩
反转字符串II
leetcode链接:leetcode.cn/problems/re…
在344. 反转字符串题的基础上多了些的反转规则,没有用到什么算法,就是模拟
var reverse = function(arr, left, right) {
while (left < right) {
let temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
var reverseStr = function(s, k) {
let strArr = s.split('');
let size = strArr.length;
// fast指针先走2k步
let slow = 0;
let fast = 2 * k - 1;
while (fast < size) {
// 反转[slow, slow+k-1]
let left = slow;
let right = slow + k - 1;
reverse(strArr, left, right);
// 更新slow和fast指针
slow = fast + 1;
fast += 2*k;
}
// fast指针越界的时候,重新指向数组末尾
fast = size - 1;
if (fast - slow + 1 < k) {
reverse(strArr, slow, fast);
} else {
reverse(strArr, slow, slow + k - 1);
}
return strArr.join('');
};
上面的代码可以优化下,只使用一个循环变量(每隔2k个字符的前k个字符进行反转)
var reverseStr = function(s, k) {
let strArr = s.split('');
let size = strArr.length;
for (let i = 0; i < size; i += 2*k) {
if (i + k - 1 < size) {
reverse(strArr, i, i + k - 1);
} else {
reverse(strArr, i, size - 1);
}
}
return strArr.join('');
};
替换数字
看到题目懵了,这么简单的题目,先将字符串转为数组,遍历数组判断元素是不是数字,是数字的话替换为number,最后返回新的字符串
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('line', function(line){
var strArr = line.split('');
for (let i = 0; i < strArr.length; i++) {
if (Number.isNaN(Number(strArr[i]))) {
continue;
} else {
strArr[i] = 'number';
}
}
console.log(strArr.join(''));
});
看了卡哥的方法后才明白不能使用库函数,要自己实现判断数字和字母的判断方法,并且使用双指针法,扩充数组的长度后,依次往里面填充新的字符
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('line', function(input){
const num0 = "0".charCodeAt();
const num9 = "9".charCodeAt();
const a = "a".charCodeAt();
const z = "z".charCodeAt();
function isAZ(str) {
return str >= a && str <= z;
}
function isNumber(str) {
return str >= num0 && str <= num9;
}
let n = 0; // 存储新数组的长度
for (let i = 0; i < input.length; i++) {
const val = input.charCodeAt(i);
if (isNumber(val)) {
n += 6;
}
if (isAZ(val)) {
n++;
}
}
let result = new Array(n).fill(0);
let index = 0;
let i = 0;
while (i < result.length) {
const val = input.charCodeAt(index);
// 遇到数字填充number进去
if (isNumber(val)) {
result[i++] = 'n';
result[i++] = 'u';
result[i++] = 'm';
result[i++] = 'b';
result[i++] = 'e';
result[i++] = 'r';
}
if (isAZ(val)) {
result[i] = input.charAt(index);
i++;
}
index++;
}
console.log(result.join(''));
});