题目1. 20200803
补充点内容
三元运算符
解决方法一: 暴力枚举的方式
var twoSun = function (nums, target) {
// 先设置一个空数组
var result = []
// 简化代码 数组长度设置为 len
var len = nums.length
// 循环遍历一下 i j
for (var i = 0; i < len; i++) {
// j 从 i + 1 开始确保不重复利用同一个元素
for (var j = i + 1; j < len; j++) {
if (nums[i] + nums[j] == target) {
result.push(i)
result.push(j)
return result
}
}
}
}
解决方法二:
插入一点 indexOf(a, b)的作用
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
var nums1 = [];
for(var i = 0;i<nums.length;i++){
// 将差值先放入num1中
nums1.push(target-nums[i]);
}
for(var i = 0;i<nums.length;i++){
if(nums1.indexOf(nums[i]) !=-1 && nums1.indexOf(nums[i])!=i){
return [i,nums1.indexOf(nums[i])];
}
}
};
题目二
var addToArrayForm = function (A, K) {
return (BigInt(A.join('')) + BigInt(K + '') + '').split('')
};
BigInt 是比Int 范围更大的整数
20200804 周二
解题方法一
关于方法一的分析
1、判断是否超出界限可以理解
2、分为正数和负数处理 可以理解
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let res = '';
let str = x+''
if(x>0){
for(var i = str.length-1;i>=0;i--){
res+=str[i]
}
}else{
for(var i = str.length-1;i>0;i--){
res = res+str[i]
}
res = -res
}
if(res<Math.pow(-2,31)||res>=Math.pow(2,31)-1){
return 0
}
return res*1
};
方法二
对这个解答的思考:
1、判断正负
2、第二步 对该数绝对值转化数组 split 反转 reverse 变回字符串join 这个很重要 需要理解和手写
/**
* @param {number} x
* @return {number}
*/
var reverse = function (x) {
// 符号判断
isSign = Math.sign(x) == -1 ? true : false
// 字符串-》数组-》反转-》字符串
const a = (Math.abs(x) + '').split('').reverse().join('')
// 是否负数
const aa = isSign ? -a : a
// 定义最大范围 math.pow是取次方
const maxVal = Math.pow(2, 31)
const minVal = Math.pow(-2, 31)
// 判断是否超出
if (aa > maxVal || aa < minVal) {
return 0
} else {
return aa
}
};
题目三
解法一:以中间数为节点,判断左右两边首尾是否相等
// 定义一个函数 判断是不是回文数
var isPalindrome = function (x) {
// 负数和个位等于0的数 不是回文数
if (x < 0 || x % 10 == 0 && x !== 0) {
return false
// 0 - 9 这种个位数 数回文数
} else if (x < 10 && x >= 0) {
return true
}
// 将这个 数转化为字符串
x = '' + x
// i < x.length / 2 遍历一半
for (let i = 0; i < x.length / 2; i++) {
// 判断前一半和后一半是否相同 不想同为 false
// 比如 x = 121 x[i] 1 2 后面这个 2 1
if (x[i] !== x[x.length - i - 1]) {
return false
}
}
return true
}
解法二:
思考:
1、这个思路很清晰
2、更加容易进行理解
3、特别要注意 回文函数的概念 负数和个位数是0的都不是
4、将数字转为数组 再数组反转为字符串B 比较两个是否相等 (并且用了绝对等于 === 不会进行强制类型转换)
var isPalindrome = function (x) {
if (x < 0 || x % 10 == 0 && x !== 0) {
return false
}
let str = '' + x
return Array.from(str).reverse().join('') === str
}
解法三:
思考:
1、这个方法很舒服
2、方法很明确 先是排除了负数和尾数是0的数
3、while循环很精巧
尤其是
这一步是实现反转 num = x % 10 + num * 10
这一步是实现取模次数 x = Math.floor(x / 10)
// 定义求回文函数
var isPalindrome = function (x) {
// 这下面依旧是x为负数及个位数是0的数不是回文数
if (x < 0 || x !== 0 && x % 10 == 0) {
return false
// 0-9 都是回文数
} else if (x >= 0 && x < 10) {
return true
} else {
let y = x
let num = 0
while (x != 0) {
// 这是while循环呀 x不等于0 会持续进行
// 得到反转的数
num = x % 10 + num * 10
// 整数除以10 计算求模的次数
// Math.floor 返回小于或者等于一个给定数字最大整数
x = Math.floor(x / 10)
}
return y === num
}
}
题目四: 数组重新排列的问题
/**
* @param {number[]} nums
* @param {number} n
* @return {number[]}
*/
var shuffle = function (nums, n) {
// 利用数组的splice方法 向/从数组中添加/删除项目,然后返回被删除的项目 会改变原数组
// 由于数组里面包含的数量是 2n 所以这个地方写 n 会将数组平均分成两份
var arrl = nums.splice(n)
// 设置一个新的空数组
var newArr = []
// 对原数组进行遍历
for (var i = 0; i < nums.length; i++) {
// 成对的放进新数组 newArr
newArr.push(nums[i],arrl[i])
//可以改写为
// newArr.push(nums[i])
// newArr.push(arr[i])
// 如果放入顺序需要相反 两个参数掉过来就好
}
return newArr
}
题目五 : 哪个得到最多糖果的孩子是true 少的是 false
加更一点
### 解题思路
1、预设最大值和结果
2、遍历找最大值 知道找最大值的方法 及最小值的方法
3、将(本来的糖果 + 额外的糖果) 和最大值进行比较 注意 这两个的和 需要用括号括起来
### 代码
```javascript
/**
* @param {number[]} candies
* @param {number} extraCandies
* @return {boolean[]}
*/
var kidsWithCandies = function (candies, extraCandies) {
// 先预设一个最大值 赋值为 0
let max = 0
// 这个用法的作用是产生一个数组
// result = [undefined * candies.length] candies.length长度个undefined 这样的一个预设的数组
let result = new Array(candies.length).fill(false)
// 遍历最大值方法一
for (let i = 0; i < candies.length; i++) {
candies[i] > max && (max = candies[i])
}
// 遍历最大值方法二
// for(let i = 0; i < candies.length; i++){
// if(candies[i] > max){
// max = candies[i] }
// 遍历最小值方法
// min = 0
//for(let i = 0; i < candies.length; i++){
//if(candies[i] < min){ min = candies[i]}
// 判断是否大于最大值 大于最大值的时候 为true
// 需要将每个人基本的糖果 + 额外的糖果 得到的结果和最大值进行比较
for (let j = 0; j < candies.length; j++) {
if ((candies[j] + extraCandies ) >= max) {
result[j] = true
}
}
return result
}
方法二:
### 解题思路
1、利用Math.max() 找最大值
2、利用 candies.map(()=>{ }) 循环得出结果
### 代码
```javascript
var kidsWithCandies = function (candies, extraCandies) {
// 1、Math.max() 找出最大值
let max = Math.max(...candies)
// 2、利用 candies.map(()=>{ }) 方法循环得出结果
return candies.map((item) => {
return (item + extraCandies) >= max
})
}
题目六: 一维数组动态和
加一点内容
### 解题思路
1、预设数组
2、数组遍历后取值循环 从第一位开始 前面有第0位
3、返回结果
### 代码
```javascript
/**
* @param {number[]} nums
* @return {number[]}
*/
var runningSum = function (nums) {
// 预设结果将nums[0] 即数组第0位,第一个值赋值给result
// const 是es6新加的语法
//有几个特性需要: 1、记住和let一样 只能在块级起作用
// 2、不会变量提升到最前面
// 3、必须对它进行赋值操作 后续不能重复赋值
const result = [nums[0]]
// 遍历一下数组
for (let i = 1; i < nums.length; i++) {
// 这个用一个数组试一下就行 比较好理解
// 比如 数组 [1,2,3,4] 1 , 1 + 2 , 1 + 2 + 3, 1 + 2 + 3 + 4
result.push(result[i - 1] + nums[i])
}
// 循环外 返回结果result
return result
}
方法二:
### 解题思路
1、设置以一个空数组
2、第0位的值给它
3、双指针循环 进行累加
### 代码
```javascript
var runningSum = function (nums) {
// 设置一个装结果的空数组
let tempArr = []
// 将数组的第一位(0位)放进去
tempArr.push(nums[0])
// 进行 2个指针的循坏
for (var i = 1; i < nums.length; i++) {
let sum = 0
for (var j = 0; j <= i; j++) {
sum += nums[j];
// 循环终止的条件 这两个相等 意思是到了最后一位
// 因为 j 比 i 小 1
if (i == j) {
tempArr.push(sum)
}
}
}
return tempArr
}
题目七 找好数对
var numIdenticalPairs = function (nums) {
// 预设一个装结果的空数组
let arr = []
// 简化代码
let len = nums.length
// 双指针进行遍历
for (var i = 0; i < len; i++) {
for (var j = i + 1; j < len; j++) {
// 判断 数组内的两个数 相同 且下标 j > i
// 将满足这个条件的数 填入到数组 arr中
if (nums[i] == nums[j]) {
arr.push(i, j)
}
}
}
return nums.length
}
### 解题思路
1、预设一个结果空数组
2、双指针遍历一下 找到大小相同的数组对
3、返回数组对对长度
### 代码
```javascript
/**
* @param {number[]} nums
* @return {number}
*/
var numIdenticalPairs = function (nums) {
// 预设一个装结果的空数组
let arr = []
// 简化代码
let len = nums.length
// 双指针进行遍历
for (var i = 0; i < len; i++) {
for (var j = i + 1; j < len; j++) {
// 判断 数组内的两个数 相同 且下标 j > i
// 将满足这个条件的数 填入到数组 arr中
if (nums[i] == nums[j]) {
arr.push([i, j])
}
}
}
return arr.length
}
题目八: 数组异或操作
解题思路
1、设置位运算的结果num
2、循环 进行位运算操作
3、返回位运算结果
代码
/**
* @param {number} n
* @param {number} start
* @return {number}
*/
var xorOperation = function (n, start) {
let num = 0
// 进行一组循环
for (let i = 0; i < n; i++) {
// 位运算 操作公式 暂时不深究
num = num ^ (start + 2 * i)
}
return num;
}
题目九: 删除中间节点
### 解题思路
总的思路:可以把要删除节点的下一个节点的值拿过来覆盖掉要删除的值,然后把要删除节点的 next 指向下一个节点的 next 即可,相当于变相把此节点删除了
1、将需要删除的这个节点选择出来
2、将这个节点的下一个节点赋给当前节点
3、将下下一个节点给需要删除节点的下一个节点
### 代码
```javascript
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} node
* @return {void} Do not return anything, modify node in-place instead.
*/
var deleteNode = function (node) {
// 1、将需要删除的这个节点选择出来
let current = node
// 2、将这个节点的下一个节点赋给当前节点
node.val = current.:next.val
// 3、将下下一个节点给需要删除节点的下一个节点
node.next = current.next.next
}
题目十:左旋转字符串
### 解题思路
// 1、+ 用来拼接字符串 ‘45’ + ‘123’ ‘45123’
// 2、s.slice(n) 表示一个字符串从位置n被切开 前面的部分不要
// 比如 s = '12345' s.slice(3) 留下的部分是'45'
// 3、s.slice(0,3)表示从0切到3 取的是 ‘123’
### 代码
```javascript
/**
* @param {string} s
* @param {number} n
* @return {string}
*/
var reverseLeftWords = function(s, n) {
// 1、+ 用来拼接字符串 ‘45’ + ‘123’ ‘45123’
// 2、s.slice(n) 表示一个字符串从位置n被切开 前面的部分不要
// 比如 s = '12345' s.slice(3) 留下的部分是'45'
// 3、s.slice(0,3)表示从0切到3 取的是 ‘123’
return s.slice(n) + s.slice(0,n)
};