最近正在准备笔试,做了一下试卷里的两道编程题,发现啥也不会o(╥﹏╥)o,所以每天练几道,边练边做笔记,下次容易复习,太菜了,还是得从简单的开始
1.反转链表
输入:1→2→3
输出:1←2←3
function ReverseList(pHead){
var cur = pHead;
var pre = null;
while(cur){
const tmp = cur.next; //存储下一个节点,以便于cur指针迭代
cur.next = pre; //两个结点之间反转
pre = cur; //pre指针后移
cur = tmp; //cur指针后移
}
return pre; //cur为null时,跳出循环,此时pre为头,因此输出pre
}
2.两数之和
给定数组和target,获取数组中两数之和等于target的元素的索引
思路:从头开始,将数组中每个元素的值作为map的key,将元素的下标作为map的value,通过判断target-当前索引的数组值是否存在于map中,如果有,则将在map中找到的下标与当前索引组成数组并返回
var twoSum = function(nums, target) {
var map = new Map();
for(let i=0;i<nums.length;i++){
if(map.has(target-nums[i])){
return [map.get(target-nums[i]),i];
}else{
map.set(nums[i],i) //map:{数组元素值:对应下标}
}
}
};
3.无重复字符的最长子串
给定一个字符串,找到字符串中无重复字符的最长子串的长度
思路:将字符串中每一个元素存入map中,并记录该元素最后一次出现的下标,遇到重复字符时,将滑动窗口左侧移动到重复字符的下一个元素,并将这一个范围的长度与res进行比较与取舍
例:aabcda
输出:4(abcd)
var lengthOfLongestSubstring = function (s) {
let left = 0; //定义左指针
let res = 0; //定义结果
let map = new Map(); //定义Map
for(let i=0;i<s.length;i++){
if(map.has(s[i]) && map.get(s[i])>left){ //查找重复并确定重复字符串是否在当前left到i这一范围内,
left = map.get(s[i]) + 1; //发现重复,将left移动到重复字符的后一个位置,并计算长度
}
res = Math.max(res,i-left+1) //res或一整个字符串
map.set(s[i],i); //将元素插入map
}
return res;
};
4.数组中的第K个最大元素
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
var findKthLargest = function(nums, k) {
return nums.sort((a,b)=>a-b).reverse()[k-1];
};
5.删除有序数组中的重复项
给你一个有序数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。
思路:双指针,左指针指向当前不重复数组的最后一项,右指针迭代原数组,若发现右指针的值由一个值变成了另一个值,则将新的值作为不重复元素赋值给左指针(相当于插入),最后左指针索引的值就是新数组长度
var removeDuplicates = function(nums) {
let len = nums.length;
let left = 1 , right = 1;
if(len == 0) return 0;
while(right<len){
if( nums[right] !== nums[right-1] ){
//发现到变化
nums[left] = nums[right];//将不重复的值赋值给左指针所在
left++;//左指针移动一次
}
right++;//右指针移动
}
return left;
};