Skip to content

Latest commit

 

History

History
258 lines (212 loc) · 5.71 KB

常见的面试题.md

File metadata and controls

258 lines (212 loc) · 5.71 KB

解析 URL Params 对象

尽可能的全面正确的解析一个任意 url 的所有参数为 Object,注意边界条件的处理。

let url =
  'http://www.domain.com/?user=�admin&id=123&id=456&city=%E5%8C%97%E4%BA%AC&enabled';

parseParam(url);
/* 要求输出结果
{ 
    user: 'anonymous',
    id: [ 123, 456 ], // 重复出现的 key 要组装成数组,能被转成数字的就转成数字类型
    city: '北京', // 中文需解码
    enabled: true, // 未指定值得 key 约定为 true
}
*/

trim 实现去除字符串首尾指定字符

String.prototype.trim = function(char, type) {
  if (char) {
    if (type == 'left') {
      return this.replace(new RegExp('^\\' + char + '+', 'g'), '');
    } else if (type == 'right') {
      return this.replace(new RegExp('\\' + char + '+$', 'g'), '');
    }
    return this.replace(
      new RegExp('^\\' + char + '+|\\' + char + '+$', 'g'),
      ''
    );
  }
  return this.replace(/^\s+|\s+$/g, '');
};

// 去除字符串首尾的全部空白
var str = ' Ruchee ';
console.log('xxx' + str.trim() + 'xxx'); // xxxRucheexxx

// 去除字符串左侧空白
str = ' Ruchee ';
console.log('xxx' + str.trim(' ', 'left') + 'xxx'); // xxxRuchee xxx

// 去除字符串右侧空白
str = ' Ruchee ';
console.log('xxx' + str.trim(' ', 'right') + 'xxx'); // xxx Rucheexxx

// 去除字符串两侧指定字符
str = '/Ruchee/';
console.log(str.trim('/')); // Ruchee

// 去除字符串左侧指定字符
str = '/Ruchee/';
console.log(str.trim('/', 'left')); // Ruchee/

// 去除字符串右侧指定字符
str = '/Ruchee/';
console.log(str.trim('/', 'right')); // /Ruchee

判断一个字符串是否是回文?

/*
 * 方法一
 * @return boolean
 */
function checkPalindrom(str) {
  return (
    str ==
    str
      .split('')
      .reverse()
      .join('')
  );
}
console.log(checkPalindrom('abccba')); // true
console.log(checkPalindrom('abcdecba')); // false

/*
 * 方法二
 * @return boolean
 */
function checkPalindrom(str) {
  let newStr = '';
  for (let i = str.length - 1; i >= 0; i--) {
    newStr += str[i];
  }
  console.log(newStr === str);
}
checkPalindrom('abccba'); // true
checkPalindrom('abcdecba'); // false

去掉一组整型数组重复的值

输入: [1, 13, 24, 11, 11, 14, 1, 2];
输出: [1, 13, 24, 11, 14, 2];

function unique(arr) {
  let newArray = [];
  let obj = {};

  for (let i = 0; i < arr.length; i++) {
    if (!obj[arr[i]]) {
      obj[arr[i]] = true;
      newArray.push(arr[i]);
    }
  }
  return newArray;
}

统计一个字符串出现最多的字母和出现的次数

  输入:absadaaaa
  输出  a, 6

  function computedStr (str) {
    let charObj = {}
    for (let i = 0; i < str.length; i++) {
      if (!charObj[str[i]]) {
        charObj[str[i]] = 1
      } else {
        charObj[str[i]] += 1
      }
    }

    let maxCharStr = ''
    let maxCount = 0
    console.log(charObj)
    for (let i in charObj) {
      if (charObj[i] > maxCount) {
        maxCharStr = i
        maxCount = charObj[i]
      }
    }
    return maxCharStr + ',' + maxCount
  }

  console.log(computedStr('abaaaasdad'))   // a,6

统计一个字符串出现的字母和出现的次数

 输入: aaabbbccdddd
 输入: {a: 3, b: 3, c: 2, d: 4}

 var strs = 'aaabbbccdddd'
 var result = str.split('').reduce((acc, curValue) => {
  acc[curValue]++ || (acc[curValue] = 1)
  return acc
 }, {})

 // 或者想装逼可以这么写
 var strs = 'aaabbbccdddd'
 var result = str
  .split('')
  .reduce((acc, curValue) => (acc[curValue]++ || (acc[curValue] = 1), acc), {})

 console.log(result) // {a: 3, b: 3, c: 2, d: 4}

最大子序和

  输入: [-2,1,-3,4,-1,2,1,-5,4],
  输出: 6
  解释: 连续子数组 [4,-1,2,1] 的和最大,为 6

  var maxSubArray = function(nums) {
    let max = nums[0]
    let sum = nums[0]

    for (let i = 1; i < nums.length; i++) {
      if (sum + nums[i] > nums[i]) { // 如果 -2 + 1 > 1
        sum = sum + nums[i]
      } else {
        sum = nums[i]
      }
      max = Math.max(max, sum)
    }

    return max
  }
  let nums = [-2,1,-3,4,-1,2,1,-5,4]
  console.log(maxSubArray(nums))

缺省数字

给定一个包含 0, 1, 2, ..., n  n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。

输入: [3,0,1]
输出: 2

输入: [9,6,4,2,3,5,7,0,1]
输出: 8
  思路一
   - 对nums做排序,从i=0的位置开始遍历数组
   - 如果i+1位置的元素减去i位置的元素为1,则i后移
   - 否则循环停止,最后返回i位置的元素加1即所需的返回值

  var missingNumber = function (nums) {
    for (let i = 0; i < nums.length; i++) {
      for (let j = 0; j < nums.length-i-1; j++) {
        if (nums[j] > nums[j+1]) {
          let temp = nums[j+1]
          nums[j+1] = nums[j]
          nums[j] = temp
        }
      }
    }
    if (nums[0] != 0) {
      return 0;
    }
    let res = null
    for (let q = 0; q < nums.length-1; q++) {
      if (nums[q+1] - nums[q] == 1) {
        continue
      } else {
        res = nums[q]+1
        break
      }
    }
    return res
  }

  思路二 (较好)
   - 用等差数列求和的方式算出前n个数的和
   - 然后依次减去数组中的每一个数,最后剩下的就是缺失的数值

  var missingNumber = function (nums) {
    let n = nums.length+1
    let sum = n * (n-1) / 2
    for (let i = 0; i < nums.length; i++) {
      sum = sum - nums[i]
    }
    return sum
  }

  思路三
   - 新建一个长度为n的数组arr都是0,然后依次遍历一遍nums
   - 把相应位置的0变成1,然后遍历一下arr看看哪个地方还是0,那么这个地方的下表对应的数就是缺失的数值了