剑指offer刷题

Posted by CodingWithAlice on September 1, 2019

剑指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])/ 表示断言,只匹配一个位置