-- 创造无限可能

js-练习二

2023-07-01 21:58:49
475 人浏览 0 人点赞
有用,点赞支持一下

练习1: 编写一个函数来查找字符串数组中的最长公共前缀。

思路:
1.取第一个数组的第一个元素与后面的元素作比较,找出公共的前缀
2.将该前缀作为第一个元素,继续与后面的元素作比较,找出公共的前缀
遍历字符串,找出相同的前缀
代码:
var longestCommonPrefix = function(strs) {
// 判断字符串是否为空
if(strs == null || strs.length===0){
return “”
}
let result = strs[0];
// 从数组的二个元素开始遍历
for(let i = 1;i < strs.length;i++){
let len = Math.min(result.length, strs[i].length);
let index = 0;
while(index < len && result.charAt(index) == strs[i].charAt(index)){
index++;
}
if(index == 0){
return “”
}
result = result.substr(0,index);
}
return result;
};

练习2: 编写一个函数来查找字符串数组中的最长公共前缀。

解题思路:使用栈和遍历
栈:后进先出
示例代码:
// 有效的括号:括号要左右配对顺序相同,相当于栈

// 字符串长度必须是偶数
// 1.遍历字符串
// 2.遇到左括号依次入栈,根据先进后出,栈顶即为最里面的左括号
// 3.遇到右括号,判断此时栈顶元素是否和Map里右括号对应的值相同,且栈不为空
// 4.若栈顶元素与右括号对应的值不匹配,则返回false
// 5.否则出栈
// 6.最后若栈为空,则是有效字符串,返回true
var isValid = function(s) {
const len = s.length;
if(len % 2 !=0){
return false;
}
const pairs =new Map([
[‘)’,’(‘],
[‘}’,’{‘],
[‘]’,’[‘],
])
let stk = [];
for(let ch of s){
if(pairs.has(ch)){
if(!stk.length || stk[stk.length-1] != pairs.get(ch)){
return false;
}
stk.pop();
}else{
stk.push(ch);
}
}
return !stk.length;
};

练习3:删除有序数组中的重复项。

解题思路:
1.使用双指针法的快慢指针,定义slow和fast做为指针。
2.初始化指针slow指向数组的起始位置(nums[0]),指针fast指向指针slow的后一个位置(nums[1])。
3.指针fast不断向后移动,将指针fast指向的元素与指针slow指向的元素进行比较。
代码:
var removeDuplicates = function(nums) {
if(nums.length == 0){
return 0;
}
// 初始化时指针slow指向数组的起始位置(nums[0]),指针fast指向指针slow的后一个位置(nums[1])。
let slow = 0,fast = 1;
while(fast<nums.length){
if(nums[fast]!=nums[slow]){
slow = slow + 1;
nums[slow] = nums[slow];
}
fast = fast + 1;
}
return slow + 1;
};

练习4:移除元素。

解题思路:
1.使用双指针法的快慢指针,定义slow和fast做为指针。
2.快指针:寻找新数组元素,新数组就是不含有目标元素的数组
慢指针:指向更新新数组下标的位置
代码:
var removeElement = function(nums, val) {
if(nums.length == 0){
return 0;
}
var slow = 0;
var fast;
for(fast = 0;fast<nums.length; fast++){
if(nums[fast] == val){
continue;
}else{
nums[slow] = nums[fast];
slow++;
}
}
return slow;
};

练习4:搜索插入位置。

解题思路:
1.利用二分法查找左边边界。
代码:
var searchInsert = function(nums, target) {
let left = 0;
right = nums.length - 1;
ans = nums.length;
while(left<=right){
let mid = parseInt((right + left)/2);
if(target <= nums[mid]){
ans = mid;
right = mid - 1;
}else{
left = mid + 1;
}
}
return ans;

};