力扣刷题记录

3.7 二分法

在这里插入图片描述

思路

顺序数组,那么就可以从中间开始比对
如果目标大于中间值,则左侧指针移动到中间
如果目标小于中间值,则右侧指针移动到中间
依次循环直到左右指针相遇

代码

  • 到最后,会一直卡在left=1 right=2 middle=2 这是因为right和left的位置会进入死循环,所以应该在原来的基础上推移
    在这里插入图片描述

  • 一直找不到答案,因为当left=right即找到时,却不进入循环了,所以永远找不到答案
    在这里插入图片描述
    最终

var search = function(nums, target) {
    var left = 0
    var right = nums.length-1
    while(left<=right){
        var middle = Math.round((left+right)/2)
        if(target<nums[middle]){
            right = middle-1
        }else if(target>nums[middle]){
            left = middle+1
        }else{
            return middle
        }
    }
    return -1
};

3.8 冒泡排序

在这里插入图片描述

思路

先使用map() 方法:返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值 ,来返回乘方后的数组
然后使用冒泡排序进行排序
在for循环的每一行中交换前后两个,再在整体中进行循环
由于每次for循环后当前的最大值一定会被挪到最后,所以下次循环可以从前一位开始

代码

var sortedSquares = function(nums) {
   nums = nums.map(item=>{
			return item*item
		})
		//console.log(nums)
		var end = nums.length
		while(end){
			var flag = 0
			for(var i=0;i<end;i++){
				if(nums[i]>nums[i+1]){
					flag = 1
					var tem = nums[i]
					nums[i] = nums[i+1]
					nums[i+1] = tem
				}
			}
			if(flag == 0){
				break
			}
			end--
		}
		return nums
};

3.9 二分法应用

在这里插入图片描述

代码

var solution = function(isBadVersion) {
    /**
     * @param {integer} n Total versions
     * @return {integer} The first bad version
     */
    return function(n) {
        var left = 0
        var right = n
        while(left<right){
            var middle = Math.floor((left+right)/2)
            if(isBadVersion(middle)){
                right = middle
            }else{
                left = middle+1
            }
        }
        return left
    };
};

3.13 (i+K)%n 置换位置

在这里插入图片描述

思路

方法1:采用循环把最后一个放到前面
方法2:利用余数除法,循环复制数组

代码

方法1:函数方法

pop() 方法用于删除并返回数组的最后一个元素。
unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。

var rotate = function(nums, k) {
		while(k){
			k--
			var x = nums.pop()
			nums.unshift(x)
		} 
		return nums
	};
		nums = [1,2,3,4,5,6,7]
		k = 3
		var xr = rotate(nums,k)
		console.log(xr)

方法2:利用余数除法

var rotate = function(nums, k) {
		const n = nums.length
		var newNums = new Array(n)
		console.log(newNums)
		for(let i=0;i<n;i++){
			newNums[(i+k)%n] = nums[i]
		}
		return newNums
	};
		nums = [1,2,3,4,5,6,7]
		k = 3
		var xr = rotate(nums,k)
		console.log(xr)

3.14 快慢指针交换

在这里插入图片描述

思路

采用左右l和r两个指针,当数字不为零则左右指针一起右移,当数字为0则右指针继续移动,左指针停下,等待左右交换后再移动

代码

var moveZeroes = function(nums) {
            let r = 0
			let n = nums.length 
			for (let l = 0; r < n;r++) {
				if (nums[r]) {
                    if(l!=r){
                        let temp = nums[l]
						nums[l] = nums[r]
						nums[r] = temp
                    }
					l++
				}		
		}
};

3.15 两数之和

在这里插入图片描述

思路

方法1:两个for循环,外加判断缩小边界
方法2:使用左右指针分别指向头尾 左右指针相加大于target则右指针左移,小于target则左指针右移 ;

代码

方法2

var twoSum = function(numbers, target) {
	let l = 0
	let r =  numbers.length-1
		
	while(l<r){
		if(numbers[r]+numbers[l]>target){
			r--
		}else if(numbers[r]+numbers[l]<target){
			l++
		}else{
			return[++l,++r]
		}
	}
			
};

3.16 反转字符串中的单词

思路

  • 方法1:原地翻转
    利用split将字符串分割到数组中 对数组进行交换左右指针实现翻转,每次交换后左指针右移右指针左移,终止条件为左指针小于右指针

代码

var reverseWords = function(s) {
    let np = s.split(" ")
    let n = np.length//一维总个数
    let flag = ""
    let i = 0
    while(i<n){
        for(let r=np[i].length-1;r>=0;r--){
            //二维长度
            flag  += np[i][r] 
        }
       i++
       if(i<n) 
       flag = flag + " "
   }
   console.log(flag)
   return flag
};

问题

在方法1中遇到了一个问题,交换后数组没有变化,刚开始以为是bug。后来发现在一维数组时,可以看见二维数组,但不能对其操作。于是改为将二维倒序拼接在字符串flag中

需要注意的是,原地解法在某些语言(比如 Java,JavaScript)中不适用,因为在这些语言中 String 类型是一个不可变的类型。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值