前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >想进大厂?一起刷 LeetCode 吧!

想进大厂?一起刷 LeetCode 吧!

作者头像
用户9999906
发布2022-09-26 11:39:23
2740
发布2022-09-26 11:39:23
举报
文章被收录于专栏:学编程的GISer

因为要为毕业之后的找工作做准备,所以大潘最近开始在leetcode上刷算法了,但是也不想花费太多时间,就计划了每天刷一道,每周回顾一下,我从上周三开始刷,到昨天为止正好刷了七道,分享到这里,如果有感兴趣的小伙伴可以一起讨论题目。我大致是跟着这个网站的顺序来刷的: https://programmercarl.com/ 因为我的方向是前端,所以我用的语言是JavaScript,下边是七道算法题及我的解题思路,欢迎小伙伴和我一起刷leetcode,有什么疑惑可以后台私信我哦~

136. 只出现一次的数字

题目描述:

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:你的算法应该具有线性时间复杂度。你可以不使用额外空间来实现吗?

示例 :

代码语言:javascript
复制
输入: [2,2,1]
输出: 1

大潘的思路:

利用异或的规则,这是个很巧妙的思路

代码:

代码语言:javascript
复制
// 136. 数组中只出现一次的数字:
function singleNumber(nums) {
  return nums.reduce((a, b) => a ^ b);
}

这里用到了一个很巧妙的计算规则:异或(^);也用到了js中的reduce()方法,对这个方法不了解的小伙伴看这个链接,很详细:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

704. 二分查找

题目描述:

给定一个 n 个元素有序的(升序)整型数组 nums和一个目标值 target,写一个函数搜索 nums中的 target,如果目标值存在返回下标,否则返回 -1。

示例 :

代码语言:javascript
复制
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

大潘的思路:

判断nums里面有没有target,有的话跳出for循环,并且此时的 i 为target的下标,没有的话 i 会循环到nums.length才跳出循环,此时说明nums中没有target

代码:

代码语言:javascript
复制
// 704 二分查找:
var search = function (nums, target) {
  first: for (var i = 0; i < nums.length; i++) {
    if (nums[i] == target) {
      break first;
    }
  }
  if (nums[i] == target) {
    return i;
  }
  if (i == nums.length) {
    return -1;
  }
};

35. 搜索插入位置

题目描述:

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

示例 :

代码语言:javascript
复制
输入: nums = [1,3,5,6], target = 5
输出: 2

大潘的思路:

因为是有序排列的数组,所以我们可以依次遍历数组,判断数组中第一个比target大的值的索引(假设是i),然后判断在这个值之前的值是等于target还是小于target,如果等于target,那么直接返回i-1,否则返回i(因为target插入在了i-1+1的位置)。但是在做这个判断之前要先判断一下target是否在这个数组的范围之内。

代码:

代码语言:javascript
复制
// 35. 搜索插入位置
var searchInsert = function (nums, target) {
  if (nums[nums.length - 1] < target) {
    return nums.length;
  } else if (nums[nums.length - 1] == target) {
    return nums.length - 1;
  }
  for (let i = 0; i < nums.length; i++) {
    if (nums[0] < target) {
      if (nums[i] > target) {
        if (nums[i - 1] == target) {
          return i - 1;
        } else if (nums[i - 1] < target) {
          return i;
        }
      }
    } else {
      return 0;
    }
  }
};

34. 在排序数组中查找元素的第一个和最后一个位置

题目描述:

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

进阶:

你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?

示例 :

代码语言:javascript
复制
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

大潘的思路:

先判断数组nums中是否有target,有的话有几个?可以通过遍历nums判断数组中有几个target(假设有n个),如果n等于0,那么直接返回[-1,-1],如果n>0,在判断nums中出现target的第一个位置的索引是几(假设是i),然后返回[ i , i+n-1 ]

代码:

代码语言:javascript
复制
// 34_在排序数组中查找元素的第一个和最后一个位置
var searchRange = function (nums, target) {
  var n = 0;
  nums.forEach((e) => {
    if (e == target) {
      n++;
    }
  });
  if (n == 0) {
    return [-1, -1];
  }
  for (var i = 0; i < nums.length; i++) {
    if (nums[i] == target) {
      return [i, i + n - 1];
    }
  }
  return arr;
};

69. x 的平方根

题目描述:

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留整数部分 ,小数部分将被舍去 。

注意:不允许使用任何内置指数函数和算符,例如pow(x, 0.5) 或者x ** 0.5

示例 :

代码语言:javascript
复制
输入:x = 4
输出:2

大潘的思路:

让i从零开始不断增大,直到i的平方大于x,返回i-1;如果正好i的平方等于x,返回i

代码:

代码语言:javascript
复制
// 69. x 的平方根
var mySqrt = function (x) {
  for (let i = 0; i < x * x + 1; i++) {
    if (i * i > x) {
      return i - 1;
    } else if (i * i == x) {
      return i;
    }
  }
};

367. 有效的完全平方数

题目描述:

给定一个正整数 num,编写一个函数,如果 num是一个完全平方数,则返回 true,否则返回 false。

进阶:不要使用任何内置的库函数,如 sqrt。

示例 :

代码语言:javascript
复制
输入:num = 16
输出:true

大潘的思路:

与上边的69题类似,让i从零开始不断增大,直到i的平方大于x,判断(i-1)的平方是否等于x,是的话返回turn,否的话返回false

代码:

代码语言:javascript
复制
// 367. 有效的完全平方数
var isPerfectSquare = function (num) {
  let i = 0;
  while (i * i < num) {
    i++;
  }
  return i * i == num;
};

27. 移除元素

题目描述:

给你一个数组 nums 和一个值val,你需要原地移除所有数值等于val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

代码语言:javascript
复制
// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
int len = removeElement(nums, val);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

示例 :

代码语言:javascript
复制
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

大潘的思路:

思路一:删除数组中值等于val的元素,并且返回此时数组的长度即可;

思路二:因为题目中描述了 “元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。” ,所以可以将数组nums中不等于val的元素依次赋值给前边的元素,最后返回数组中元素不等于val的个数即可

代码:

思路一:

代码语言:javascript
复制
// 27. 移除元素
var removeElement = function (nums, val) {
  for (var i = 0; i < nums.length; i++) {
    if (nums[i] == val) {
      nums.splice(i, 1);
      i--;//因为删掉了数组nums中的一个值,所以为了正常遍历后边的元素,i要减1
    }
  }
  return i;
};

思路二:

代码语言:javascript
复制
// 27. 移除元素
var removeElement = function (nums, val) {
  let n = 0;
  for (var i = 0; i < nums.length; i++) {
    if (nums[i] != val) {
      nums[n] = nums[i];
      n++;
    }
  }
  return n;
};
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 学编程的GISer 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 136. 只出现一次的数字
  • 704. 二分查找
  • 35. 搜索插入位置
  • 34. 在排序数组中查找元素的第一个和最后一个位置
  • 69. x 的平方根
  • 367. 有效的完全平方数
  • 27. 移除元素
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档