代码随想录算法训练营第6天|字母异位词、数组交集、快乐数

快速判断一个元素是否出现集合里的时候,就要考虑哈希法

lc242有效的字母异位词

思路

统计原字符串各字母出现频率,如果新字符串使得集合中所有字母频率归零,则是字母异位词

代码

class Solution {
    public boolean isAnagram(String s, String t) {
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++){
            Character ch = s.charAt(i);
            map.put(ch, map.getOrDefault(ch, 0) + 1);
        }
        for (int i = 0; i < t.length(); i++){
            Character ch = t.charAt(i);
            if (map.getOrDefault(ch, 0) == 0){
                return false;
            }
            map.put(ch, map.get(ch) - 1);
        }
        for (int temp : map.values()){
            if (temp != 0){
                return false;
            }
        }
        return true;
    }
}

lc349两个数组的交集

思路

一个HashSet存一个数组的元素,一个HashSet在遍历另一个数组时保存不重复的交集

代码

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set = new HashSet<>();
        Set<Integer> resList = new HashSet<>();
        for (int i = 0; i < nums1.length; i++){
            set.add(nums1[i]);
        }
        for (int i = 0; i < nums2.length; i++){
            if (set.contains(nums2[i])){
                resList.add(nums2[i]);
            }
        }
        int index = 0;
        int res[] = new int[resList.size()];
        for(int i:resList){
            res[index++] = i;
        }
        return res;
    }
}

lc202快乐数

思路

无限循环时注意及时退出,使用set来快速判断是否出现过n

代码

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> record = new HashSet<>();
        while (n != 1 && !record.contains(n)){
            record.add(n);
            int sum = 0;
            while (n != 0){
                int num = n % 10;
                sum += num * num;
                n = n / 10;
            }
            n = sum;
        }
        return n==1;
    }
}

lc1两数之和

思路

边遍历边看另一个元素(和-当前元素)是否已经存在,不存在把当前元素添加到HashMap中

代码

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i=0; i < nums.length; i++){
            if (map.containsKey(target-nums[i])){
                return new int[]{i, map.get(target-nums[i])};
            } else{
                map.put(nums[i], i);
            }
        }
        return new int[]{};
    }
}

全部评论

相关推荐

🤔&nbsp;面试感受十月底投了联洲,当时收到笔试一看好多都不会,没想到联洲居然给过了,很快收到一面通知。当时完全不知道该怎么准备,全是看大家分享的面经一步步准备才得以顺利过关,吃水不忘挖井人,现在已经签约,分享一下自己的面经。11.1早上做完测评,下午就收到一面通知,然后开始背八股。11.05一面约了20min,15min结束晚上开始的面试,面试官很严肃,开局先自我介绍,然后重点问了一下项目。接下来就是八股TCP/UDP的区别七层协议有什么socket&nbsp;API接口编程进程间通信方式进程间同步互斥锁/自旋锁linux怎么调用内核内存泄露是什么,怎么排查,怎么解决static关键字进程与线程的区别排序算法有哪些反问问一个问题11.07二面&nbsp;30minTP早上刚上班那会面的,本来以为很严肃,但是面试官特别温柔和蔼。开局也是先自我介绍,然后深挖项目,重点问了一个实习经历和一个项目经历,这个谈了蛮久。然后来问一些技术问题吧TCP5层模型有哪些?具体用了什么协议一面以后好好看了,但是协议太多没记住(挠头,笑)口述代码x3:委婉的表示自己没怎么刷题哈希表是怎么实现的,哈希冲突怎么解决,能不能口述代码&nbsp;,哈希桶有没有了解二叉树怎么遍历,怎么用队列实现二叉树的遍历排序算法知道哪些?来讲一讲冒泡排序实现与优化这三个答得我真是汗流浃背然后反问,问了一下部门细分和加班问题,面试官他们部门加班好像没有太离谱,大开心然后一直等啊等,没忍住催了一下HR,然后光速收到变成终面待安排,联洲效率真高。11.21终面因为二面表现不太理想,然后看到好多终面有问八股的,这十几天好好深挖了一下数据结构相关问题和八股以待拷打但是面试官一个都没问😫自我介绍项目怎么做的,我答的比较详细,具体框架讲的很明白,所以很快到下一个问题考研/找工作有什么兴趣爱好为什么想来成都这个城市等等两个小时以后发了终测下午就发了座谈会11.27offer&nbsp;sp秋招结束记录一下我的面试过程,以为后来人提供参考。 #面经#
查看19道真题和解析
点赞 评论 收藏
分享
&nbsp;CPU、寄存器、缓存、内存概述-&nbsp;CPU:中央处理器,执行指令的核心组件。-&nbsp;寄存器:CPU内部的临时存储空间,存放快速访问的数据。-&nbsp;缓存(Cache):在寄存器和内存之间的高速存储,分为三级(L1、L2、L3),速度和价格依次降低。-&nbsp;内存:主要存储程序和数据的地方。数据访问流程1.&nbsp;CPU首先在寄存器中查找数据。2.&nbsp;如果寄存器未命中,则检查缓存。3.&nbsp;如果缓存未命中,则从内存中获取数据。内存区域-&nbsp;栈区:&nbsp;&nbsp;-&nbsp;存放函数参数和局部变量。&nbsp;&nbsp;-&nbsp;由编译器自动分配和释放,效率高,但内存量有限(如iOS中为2M)。-&nbsp;堆区:&nbsp;&nbsp;-&nbsp;通过`new`、`malloc`等动态分配的内存。&nbsp;&nbsp;-&nbsp;需要程序员手动释放,可能导致内存泄漏。-&nbsp;静态区:&nbsp;&nbsp;-&nbsp;存放全局变量和静态变量。&nbsp;&nbsp;-&nbsp;程序结束时由系统释放。-&nbsp;常量区:&nbsp;&nbsp;-&nbsp;存放常量,不允许修改。&nbsp;&nbsp;-&nbsp;代码区:&nbsp;&nbsp;-&nbsp;存放函数体的二进制代码。类型说明符-&nbsp;基本类型:`void`、`char`、`short`、`int`、`long`、`signed`、`unsigned`、`float`、`double`、`struct`、`enum`、`union`。-&nbsp;存储类型:`extern`、`static`、`register`、`auto`、`typedef`。-&nbsp;类型限制符:`const`(只读)、`volatile`。变量理解-&nbsp;extern:指示变量在其他文件中定义。-&nbsp;static:&nbsp;&nbsp;-&nbsp;限制变量作用域。&nbsp;&nbsp;-&nbsp;局部变量存入静态存储区,延长生存周期。-&nbsp;register:将频繁使用的变量放入寄存器以提高效率。-&nbsp;auto:C语言默认存储类型。-&nbsp;typedef:给类型或变量表达式起别名。-&nbsp;const:只读变量。-&nbsp;volatile:&nbsp;&nbsp;-&nbsp;防止编译器优化。&nbsp;&nbsp;-&nbsp;适用于中断和多线程环境。C程序内存分配-&nbsp;堆、栈、静态存储区、文件分配区(常量字符串)、程序分配区(二进制代码)。&nbsp;sizeof与strlen-&nbsp;sizeof:关键字,返回类型或数组的字节大小。-&nbsp;strlen:计算字符串长度,直到遇到`\0`。&nbsp;函数参数传递-&nbsp;值传递、引用传递、指针传递、数组地址传递。Const、指针、基本类型组合的意义-&nbsp;const&nbsp;int&nbsp;x:只读变量。-&nbsp;const&nbsp;char&nbsp;*x:指向常量的指针,指针内容可变,指向内容不可变。-&nbsp;char&nbsp;*const&nbsp;x:常量指针,指针内容不可变,指向内容可变。-&nbsp;const&nbsp;char&nbsp;*const&nbsp;x:指针和内容均不可变。&nbsp;数组与指针-&nbsp;物理地址:内存单元的真实地址。-&nbsp;逻辑地址:CPU生成的地址。&nbsp;Linux进程间通信-&nbsp;管道(pipe)、信号量、消息队列、信号、共享内存、套接字。&nbsp;strcpy与memcpy区别-&nbsp;strcpy:复制字符串。-&nbsp;memcpy:复制指定长度的内存内容。&nbsp;内存泄漏与内存溢出-&nbsp;内存泄漏:未释放的内存,导致可用内存减少。-&nbsp;内存溢出:程序请求的内存大于可用内存。&nbsp;switch的变量类型限制-&nbsp;允许:整形、布尔、字符、枚举。-&nbsp;不允许:字符串等非基本类型。&nbsp;防止头文件重复调用-&nbsp;使用#ifndef和#pragma&nbsp;once。&nbsp;实时操作系统-&nbsp;示例:FreeRTOS、Ucos。&nbsp;指针数组与数组指针-&nbsp;指针数组:数组元素为指针。-&nbsp;数组指针:指向数组的指针。&nbsp;结构体自增与双重指针自增-&nbsp;自增从右向左进行。&nbsp;寄存器的使用-&nbsp;存储频繁调用的数据,减少内存访问。&nbsp;获取全局变量与局部变量地址(gdb)-&nbsp;使用backtrace或bt命令。&nbsp;进程中的同步与异步-&nbsp;同步:通过锁实现。-&nbsp;自旋锁:忙等待,不阻塞线程。-&nbsp;互斥锁:阻塞线程,等待资源释放。进程与线程的关系与区别-&nbsp;进程:资源分配的基本单位,包含一个或多个线程。-&nbsp;线程:进程中的执行单位,最小调度单位。树的遍历(递归与非递归)-&nbsp;中序遍历:左子树&nbsp;-&nbsp;根节点&nbsp;-&nbsp;右子树,利用堆栈进行进栈和出栈操作。剩余的大佬面经总结了&nbsp;&nbsp;链接在下边&nbsp;&nbsp;c++/嵌入式面经专栏-牛客网 https://www.nowcoder.com/creation/manager/columnDetail/MJNwoM
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务