leetcode面试算法题

1.数组/字符串

1.1合并两个有序数组

java 复制代码
class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int p1 = 0;//遍历数组1
        int p2 = 0;//遍历数组2

        int[] nums3 = new int[m + n];
        int p = 0;
        while (p1 < m && p2 < n) {//当数组1、2都没遍历完
            nums3[p++] = nums1[p1] <= nums2[p2] ? nums1[p1++] : nums2[p2++];
        }

        while (p1 < m) {
            nums3[p++] = nums1[p1++];
        }

        while (p2 < n) {
            nums3[p++] = nums2[p2++];
        }

        for (int i = 0; i < m + n; i++) {
            nums1[i] = nums3[i];
        }
    }
}

1.2移除元素

java 复制代码
class Solution {
     public int removeElement(int[] nums, int val) {

        if(nums.length<1) return 0;

        int l = 0;
        int r = nums.length - 1;
        int res = 0;

        while (l < r) {
            if (nums[l] == val) {
                //换到最末尾的元素一定是和val相同,但换过来的元素还没比较,因此不能直接l--
                swap(l, r--, nums);
            } else {
                res++;//数组有效长度+1
                l++;
            }
        }

         if (nums[l] != val) {
            res++;
        }

        return res;
    }
     public void swap(int a, int b, int[] nums) {
        int temp = nums[a];
        nums[a] = nums[b];
        nums[b] = temp;
    }
}

2.哈希表

2.1有效的字母异位词

java 复制代码
class Solution {
       public boolean isAnagram(String s, String t) {

        if (s.length() != t.length()) return false;

        int[] num = new int[26];

        for (int i = 0; i < s.length();i++){
            num[s.charAt(i)-'a']++;
            num[t.charAt(i)-'a']--;
        }

        for (int i : num) {
            if (i!=0){
                return false;
            }
        }

        return true;
    }
}

2.2快乐数

解释:由于我们知道int的最大值为2147483647,而在这个数字之内的最大的next(next 为各位数字的平方和)。是1999_999_999 (1999_999_999 = 1*1 + 9*9*9(一共有9位数位9))。

根据以上表格,我们可以发现,即使数字很大,next 范围也会跌下来,很快陷入 [1,243] 这个范围内,这是因为即使是1999_999_999,在经过一次运算以后,也会变成730,而730在[100,999]这个范围之内,说明之后进行快乐数运算,一定会在[1,243]这个范围之内!

所以在有限次循环之内,就会出现相同的值。接下来面临循环或者达到 1 退出。这是典型的环形链表问题,我们可以通过快慢指针来解决。

java 复制代码
class Solution {
    public boolean isHappy(int n) {
        int m = getNext(getNext(n));//快指针,每次进行两次运算
        while (m != n) {
            m = getNext(getNext(m));
            n = getNext(n);
        }
        if (m == 1) {//比较最后相遇的值
                return true;
        }
        return false;
    }

    public int getNext(int n) {//获取当前n的下一个数
        int sum = 0;
        while (n > 0) {
            int m = n % 10;
            n = n / 10;
            sum += m * m;
        }
        return sum;
    }
}
相关推荐
计算机安禾4 分钟前
【数据结构与算法】第46篇:算法思想(一):递归与分治
c语言·数据结构·c++·算法·visualstudio·图论·visual studio code
Sirens.5 分钟前
七大经典排序算法:原理、实现与复杂度分析
java·数据结构·算法·排序算法
wfbcg11 分钟前
每日算法练习:LeetCode 54. 螺旋矩阵 ✅
算法·leetcode·矩阵
黎阳之光14 分钟前
【从虚拟到实体:黎阳之光实时三维重构,开启AI空间智能新纪元
大数据·人工智能·算法·安全·数字孪生
jghhh0121 分钟前
基于主从博弈的主动配电网阻塞管理:MATLAB实现
算法·matlab
一块小土坷垃26 分钟前
最近发现了一款很好玩的SBTI测试的APP
面试·职场和发展·sbti
zjeweler27 分钟前
“网安+护网”终极300多问题面试笔记-2共3-计算机网络相关 - 好淘云
笔记·计算机网络·web安全·面试·职场和发展·护网行动·护网面试
小O的算法实验室29 分钟前
2022年IEEE TITS,基于 VRP 优化模型的城市轨道交通智能物流车辆配送路径优化,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
_日拱一卒35 分钟前
LeetCode:206反转链表
算法·leetcode·链表
我不是懒洋洋41 分钟前
【经典题目】链表OJ(轮转数组、返回倒数第k个节点、链表的回文结构)
c语言·开发语言·数据结构·算法·链表·visual studio