leetcode(刷题总结)

1. 字符串查找,字符串比较大小

比较的时候,从字符串左边开始,依次比较每个字符,直接出现差异、或者其中一个串结束为止。( 比较ASCII码 )

比如ABC与ACDE比较,第一个字符相同,继续比较第二个字符,由于第二个字符是后面一个串大,所以不再继续比较,结果就是后面个串大。

再如ABC与ABC123比较,比较三个字符后第一个串结束,所以就是后面一个串大

2. 求交集

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersect = function(nums1, nums2) {
  // 先排序 然后双指针
  var resultArr = []
  var nums1Sort = nums1.sort((a, b) => { return  a - b })
  var nums2Sort = nums2.sort((a, b) => { return a - b })
  // 双指针
  var nums1Point = 0
  var nums2Point = 0
  while (nums1Point < nums1Sort.length && nums2Point < nums2Sort.length) {
    // 如果指针值相等 存入
    if (nums1Sort[nums1Point] === nums2Sort[nums2Point]) {
      resultArr.push(nums1Sort[nums1Point])
      nums1Point++
      nums2Point++
    } else if (nums1Sort[nums1Point] < nums2Sort[nums2Point]) { // 不相等值小的指针向后移
      nums1Point++
    } else {
      nums2Point++
    }
  }
  return resultArr
};

还有一种解法,使用hashmap 记录其中一个数组每个元素出现的次数

再遍历另一个数组,map里存在就说明有,然后存入结果数组,hashmap 对应的值减一

var intersect = function(nums1, nums2) {
   var hashMap = {}
   var resultArr = []
   for (var i = 0; i < nums1.length; i++) {
     if (hashMap[nums1[i]]) { // 存在
        hashMap[nums1[i]]++
     } else {
       hashMap[nums1[i]] = 1 // 不存在
     }
   }
   for (var j = 0; j < nums2.length; j++) {
     if (hashMap[nums2[j]]) { // 存在
        resultArr.push(nums2[j])
        hashMap[nums2[j]]--
     }
   }
   return resultArr
};

3. while 退出循环 继续执行下面的代码 break

4. 旋转数组的套路:

左边的指针与中间元素比较,判断哪半部分是递增的

var search = function(nums, target) {
    var left = 0
    var right = nums.length - 1
    while (left <= right) {
      var mid = parseInt((left + right) / 2)
      if (nums[mid] === target) {
        return true
      }
      if (nums[left] === nums[mid]) { // 相等两侧 判断不出来哪端递增
          left++
      } else if (nums[left] > nums[mid]) { // 左侧大于中间的,说明后半部分是递增的
        // 然后判断要找的值是否在后半部分里面 是就去后半部分里面找
        if (nums[mid] <= target && nums[right] >= target) {
          left = mid + 1
        } else { // 不是去前半部分找
          right = mid - 1
        }
      } else { // 左指针的值小于中间值 说明前半段是递增的
          if (nums[left] <= target && nums[mid] >= target) {
            right = mid - 1
          } else {
            left = mid + 1
          }
      }
    }
    return false
};

5. 字符串修改其中的某个值,不能通过下标修改,基础数据类型(正则修改或者转成数组用下标修改)

6. 判断两个字符是否互为大小写

var test = function(a, b) {
      return (a.charCodeAt() !== b.charCodeAt()) && (a.toLowerCase() === b.toLowerCase())
};

两个字符的编码不相等,但是 他们同转为小写字母相等

7. 删除最外层括号

 

/**
 * @param {string} S
 * @return {string}
 */
var removeOuterParentheses = function(S) {
    var stack = []
    var count = 0
    for (var i = 0; i < S.length; i++) {
        if (S[i] === '(') {
            count ++
            // 根据数量判断
            if (count >= 2) {
                stack.push(S[i])
            }
        } else if (S[i] === ')') {
            count --
            // 根据数量判断
            if (count >= 1) {
                stack.push(S[i])
            }
        }
    }
    return stack.join('')
};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值