力扣刷题记录
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 类型是一个不可变的类型。