剑指offer刷题(分类)
第一题 :
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序, 每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
// 思想分析:从四个对角上面开始比较,这里用的是从左下角的值开始比较,
// target大于当前值,就向右移动j++;target小于当前值,就向上移动i--
arr = [
[1, 2, 8, 9],
[2, 4, 9, 12],
[4, 7, 10, 13],
[6, 8, 11, 15]
];
target = 5;
function Find(target, arr) {
// i 行;j 列
for (let i = arr.length - 1, j = 0; i >= 0 && j < arr[0].length;) {
if (arr[i][j] == target) {
return 'true'
}
if (arr[i][j] > target) {
i--;
} else {
j++;
}
}
return 'false'
}
console.log(this.Find(target, arr));
第二题:请实现一个函数,将一个字符串中的每个空格替换成“%20”。
例如,当字符串为We Are Happy. 则经过替换之后的字符串为We%20Are%20Happy。
str = "he llo world";
// 方法一:split、join 在js中字符串自带函数
function replaceSpace(str) {
let arr = str.split(' ');
return arr.join("%20")
}
// 方法二:堆栈 新建一个数组,遇到空的时候压替换值入栈
function replaceSpace(str) {
let result = [];
for (let i = 0; i < str.length; i++) {
if (str[i] == " ") {
result.push("%20");
} else {
result.push(str[i]);
}
}
return result.join('').toString();
}
console.log(replaceSpace(str));
笔试题:连字符字符串与驼峰字符串的相互转换
连字符转驼峰:
第一种方法:使用正则匹配函数
let str = 'str-arr-test';
str = str.replace(/(\w*)-(\w*)/g, function ($1, $2, $3) {
//console.log($2, $3);
return $2 + $3[0].toUpperCase() + $3.slice(1);
});
console.log(str);//strArrTest
第二种方法:使用 js 中 split 和 reduce 方法
let str = 'str-arr-test';
str = str.split('-').reduce((acc, val, idx) => idx === 0 ?
acc + val : acc + val[0].toLocaleUpperCase() + val.slice(1), '');
console.log(str);//strArrTest
驼峰转连字符
第一种方法:正则
let str = 'strArrTest';
str = str.replace(/([A-Z])/g, function ($1) {
return '-' + $1.toLocaleLowerCase();
});
console.log(str);//str-arr-test
第二种方法: 使用正则非捕获组来切割数组,然后使用 reduce 遍历所有元素
let str = 'strArrTest';
str = str.split(/(?=[A-Z])/g).reduce((acc, val, idx) => idx === 0 ?
acc + '-' + val : acc + '-' + val[0].toLocaleLowerCase() + val.slice(1));
console.log(str);//str-arr-test
补充:/(?=[A-Z])/
表示断言,只匹配一个位置