0803 开始学习算法 每天刷力扣 (一)里面包含10道题目

题目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、数组遍历后取值循环 从第一位开始  前面有第03、返回结果

### 代码

```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)
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值