前端算法练习(持续更新)

284 阅读2分钟
最近正在准备笔试,做了一下试卷里的两道编程题,发现啥也不会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的元素的索引

思路:从头开始,将数组中每个元素的作为mapkey,将元素的下标作为mapvalue,通过判断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) 额外空间的条件下完成。

思路:双指针,左指针指向当前不重复数组的最后一项,右指针迭代原数组,若发现右指针的值由一个值变成了另一个值,则将新的值作为不重复元素赋值给左指针(相当于插入),最后左指针索引的值就是新数组长度

26删除有序数组重复项.gif

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