秋招突击——算法练习——8/30、9/4——技巧题练习——复习{}——新作{只出现一次的数字、多数元素、颜色分类、下一个排列、寻找重复数}

news2024/9/24 15:20:33

文章目录

    • 引言
    • 复习
    • 新作
      • 136、只出现一次的数字
        • 个人实现
      • 169、多数元素
        • 个人实现
      • 75、颜色分类
        • 个人实现
        • 参考实现
      • 31、下一个排列
        • 个人实现
        • 参考实现
      • 287寻找重复数
        • 个人实现
        • 参考实现
    • 总结

引言

  • 手撕的代码大部分都是出自于这里,还是要继续加强,把剩下一些零碎的题目再过一遍,然后再把hot100再刷一遍,这次重在于思想,而不是代码和答案。

复习

新作

136、只出现一次的数字

  • 题目链接
    在这里插入图片描述
    注意
  • 输入的是数组,并且不会越界,使用int就能够存储
  • 元素中出了一个元素只出现一次,其余元素都出现了两次
  • 输出仅仅出现一次的元素
个人实现
  • 这个题目就是使用异或运算,异或运算,满足交换性,自反性和结合性。
class Solution {
    public int singleNumber(int[] nums) {
        int  res = nums[0];
        for(int i = 1;i < nums.length;i ++)
            res ^= nums[i];
        return res;
    }
}

在这里插入图片描述

169、多数元素

题目链接
在这里插入图片描述
注意

  • 给的是一个有重复元素的数组,一定存在一个元素出现的次数是超过了总数量的一半
  • 数组不为空,一定会有一个答案
个人实现
  • 直白的就是遍历整个数组,然后统计一下次数,然后返回最大的结果。
class Solution {
    public int majorityElement(int[] nums) {
        Map<Integer,Integer> map = new HashMap<>();
        int[] res = {0,0};
        for(int x:nums){
            map.put(x,map.getOrDefault(x,0) + 1);
            int count = map.get(x);
            if( count >= res[1]){
                res[0] = x;
                res[1] = count; 
            }
        }
        return res[0];
    }
}

在这里插入图片描述
总结

  • 如果这个题目是一个场景题,现在有10亿个数字,你应该怎么做?
  • 没有办法全部加载到内存中,只能一部分一部分加载到内存中,然后统计次数,保存到hashmap中吗?不对,感觉这个方法不对!

摩尔投票算法

class Solution {
    public int majorityElement(int[] nums) {
        int count = 0;
        int num = 0;
        for(int x:nums){
           if(count == 0){
            count = 1;
            num = x;
           }else{
                if(x == num) count ++;
                else count --;
           }
        }
        return num;
    }
}

在这里插入图片描述

75、颜色分类

题目链接
在这里插入图片描述
注意

  • 总共只有三种数字,分别是0、1、2,然后相同的数字放在一起,然后按照0、1、2进行排序
  • 只能使用常数空间实现!
个人实现
  • 如果常数空间,直白的话就是使用交换排序,因为元素是知道的,然后相对顺序也是知道的,直接双指针交换就行了!

在这里插入图片描述
这里有一个思路,这个右侧肯定是2,然后左侧肯定是0,所以逐个进行遍历,出现2往右移动,出现0往左移动就行了!

class Solution {
    public void sortColors(int[] nums) {
        int m = nums.length - 1;
        int l = 0,r = m;
        int cur = l ;

        // 使用三指针,中间的指针用来遍历,左右指针用来保存
        while(cur <= r){
            // 往右加换2,保证r指针右侧都是2
            // 
            if(nums[cur] == 2){
                while(r > cur && nums[r] == 2) r--;
                int temp = nums[r];
                nums[r] = nums[cur];
                nums[cur] = temp;
                r--;
            }

            // 往左交换0,保证l左侧的指针都是0
            if(nums[cur] == 0){
                while(l < cur && nums[l] == 0) l ++;
                int temp = nums[l];
                nums[l] = nums[cur];
                nums[cur] = temp;
                l ++;
            }        

            // 然后在移动对应的cur指针
            cur ++;    
        }
        return;
    }
}

在这里插入图片描述
总结

  • 这道题感觉做的还是有点久的,因为一开始用了双指针进行交换,但是有一些问题解决不了,就想着用三指针,因为知道2就往右,0就往左,是固定的!
  • 然后重新写了一下!
参考实现
  • 单指针就需要遍历两次,然后双指针就是需要遍历一次,这里用的方法和我的差不多,不过代码上更简洁一点,具体实现如下

流程图直接看这里

class Solution {
    public void sortColors(int[] nums) {
        int m = nums.length - 1;
        int p0 = 0, p1 = 0;

        // 使用三指针,中间的指针用来遍历,左右指针用来保存
        for (int i = 0; i <= m; i++) {
            if (nums[i] == 1) {
                int temp = nums[i];
                nums[i] = nums[p1];
                nums[p1] = temp;
                p1++;
            } else if (nums[i] == 0) {
                int temp = nums[i];
                nums[i] = nums[p0];
                nums[p0] = temp;
                if (p0 < p1) {
                    temp = nums[i];
                    nums[i] = nums[p1];
                    nums[p1] = temp;
                }
                p0++;
                p1++;
            }
        }
        return;
    }
}

31、下一个排列

题目链接
在这里插入图片描述
注意

  • 当前序列会有若干序列,需要找出下一个字典序中的序列是什么
  • 只能原地修改,只允许使用额外的常数空间
个人实现
  • 这个没什么好的方法,然后直接看参考实现吧!
参考实现

在这里插入图片描述

class Solution {
    public void nextPermutation(int[] nums) {
        // 主要分为两部,先是找到较小的,然后再找比较小的大的
        // 然后进行交换,然后在排序
        // 这里需要遍历对应的元素
        int n = nums.length;
        if(n == 1)  {
            return;
        }
        if(n == 2){
            swap(nums,0,1);
            return;
        }

        // 超过两个元素的情况
        int i = nums.length - 2;
        while(i >= 0 && nums[i] >= nums[i + 1]){
            i --;
        }

        if(i >= 0){
            int j = nums.length - 1;
            while(j >= 0 && nums[i] >= nums[j]){
                j --;
            }
            swap(nums,i ,j);
        }
        reverse(nums,i + 1 ,nums.length - 1);


    }

    // 交换元素
    public void swap(int[] nums,int i,int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    
    }

    public void reverse(int[] nums ,int i ,int j){
        // 将从i到j 的序列进行反转
        while(i <= j){
            swap(nums,i , j);
            i ++;
            j --;
        }
    }
}

在这里插入图片描述

287寻找重复数

题目链接
在这里插入图片描述
注意

  • 有一个数字树出现了多次,然后其他的数字仅仅出现了一次
  • 找出这个出现多次的数字
个人实现

个人思路

  • 不能修改原来的数组,所以不能进行排序了,如果能够排序,那就好做了!
  • 然后只能使用常数的存储空间,就不能创建一个类似hash表的结构进行处理的
  • 针对这类题目,常规的会使用bitmap,操作位图,然后需要遍历的,但是这样就不是常数的存储空间了,而且就算申请了固定的存储存储空间也是取巧!
  • 抓住两个点,所有的数组都是在1到n之间的,而且只有一个数字是重复的,其他的数字都是唯一的
    • 求和感觉看不出来什么,其他的也看不出来啥,为什么求和,是因为他是一个顺序不一样的操作,所以不得行!,那想想看,能不能对每一个元素做差,然后再求绝对值,然后在求和,最小的时候,就是最大的!

在这里插入图片描述

  • 平均减一,做差求和的思路去试试看
  • 通过下述的方式,可以看出来重复多少次,以及具体是什么值
    在这里插入图片描述
class Solution {
    public int findDuplicate(int[] nums) {
        int n = nums.length;
        int preSum = 0;
        int res = 0;
         for(int j = 0;j < n;j ++){
                preSum += nums[j];
            }
        for(int i = 1;i <= n;i ++){
            int sum = 0;
            for(int j = 0;j < n;j ++){
                sum += Math.abs(nums[j] - i);
            }
            // 判定是否相等
            System.out.println(sum + "  " + preSum);
            
            if(preSum > sum){
                res ++;
            }
            preSum = sum;
            
        }
        return res;
    }
}

总结

  • 这个不会,属实整不会了,不知道怎么弄!因为如果是单单最小的和话,1这种情况无解!
参考实现
  • 这里使用了快慢指针来实现,因为所有数字都是在1到n的,所以可以转成图论来看这个问题,具体如下
    在这里插入图片描述

  • 使用快慢指针的话,快慢相遇表示会成环

  • 然后在确定环的切入点就行

class Solution {
    public int findDuplicate(int[] nums) {
        int a = 0, b = 0;
        while (true) {
            a = nums[a]; // a走一步
            b = nums[nums[b]]; // b走两步
            if (a == b) {
                a = 0;
                while (a != b) {
                    a = nums[a];
                    b = nums[b];
                }
                return a;
            }
        }
    }
}

切入点的疑惑

  • 找到相遇点了,为什么a直接从零开始遍历,再次相遇,然后同时运行,再次相遇就是相遇点了!

在这里插入图片描述

总结

  • 继续加油,秋招还有机会!
  • 感觉要做一个自己的博客网站了,CSDN不是很好用,首先搜索我自己的博文的时候,居然没有办法进行模糊匹配,我搜环形链表,居然搜出来为空,然后只能自己一个一个找,这个效率太低了!
    • 搞一个自己的博客,至少以后面试也有的讲!
  • 秋招还是比较难得,好不容易面过了美团,结果没有HC,直接回到了人才池,然后重新开始面试吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2105181.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10分钟学会Jmeter的用法

一提到接口测试&#xff0c;通常大家会有这样的疑问&#xff1a;前端测试不是已经覆盖到各种业务逻辑了吗&#xff1f;为什么还要做接口测试&#xff0c;接口测试和前端测试是不是重复了&#xff1f;对于这个问题&#xff0c;可以从下面几个方面来解释&#xff1a; 什么是接口…

Ubuntu共享文件夹的设置

ubuntu的操作路径时&#xff1a;/mnt/hgfs/51C_share

Mongodb 4.2.25 安装教程

一、上传部署包 1.1上传mongodb包进入/usr/local目录&#xff0c;将mongodb-linux-x86_64-rhel70-4.2.25.tgz包传到该目录下。 cd /usr/local 二、安装 2.1解压 tar zxvf mongodb-linux-x86_64-rhel70-4.2.25.tgz 2.2修改名称 mv mongodb-linux-x86_64-rhel70-4.2.25/ mong…

《OpenCV计算机视觉》—— 模板匹配

文章目录 一、模板匹配简单介绍二、三个主要函数的介绍1.执行模板匹配函数-cv2.matchTemplate()2.查找最佳匹配函数-cv2.minMaxLoc()3.在原图上绘制匹配区域函数-cv2.rectangle() 三、代码实现 一、模板匹配简单介绍 在Python中&#xff0c;模板匹配是一种在图像中查找与给定模…

记录一下blender烘焙贴图黑边的一个坑

首先是拆UV这里 margin 0.1 better share better 这个也大一点好了 这样烘焙的猴头就是正常的 这里的坑点是 降噪&#xff01;&#xff01;烘焙如果开启降噪 如果关闭下面那一个 会好一点&#xff0c;都关闭了&#xff0c;才是最上面的效果

2024全国大学生数学建模国赛评审细则

2024全国大学生数学建模国赛评审细则 —参考2023年全国大学生数学建模竞赛C题评阅细则 评分体系阅览 —分值结果仅供参考 80分&#xff1a;稳国一&#xff1b; 65分&#xff1a;达国奖门槛&#xff08;70分更为稳妥&#xff09;&#xff1b; 60至50分&#xff1a;有望获省…

整形提升-C语言

整型提升的原则&#xff1a;当一个小字节数&#xff0c;向大字节数转换时&#xff0c;有符号补0或1,无符号补0&#xff1b; 为什么会发生测试结果呢&#xff0c;让我们来看一下 在64位的环境中char是1个字节8位 char a1; 1000 0001 原码 整形提升 111…

网恋照妖镜源码搭建教程

文章目录 前言创建网站1.打开网站设置 配置ssl2.要打开强制HTTPS&#xff0c;用宝塔免费的ssl证书即可&#xff0c;也可以使用其他证书&#xff0c;必须是与域名匹配的3.上传文件至根目录进行解压4.解压后&#xff0c;修改文件 sc.php 里面的内容5.其余探索 前言 前俩年很火的…

ComfyUI中IC-Light节点的Detail Transfer节点参数测试

&#x1f386;背景 ic-light是一个能重绘画面光影的节点&#xff0c;但是在重绘的过程中&#xff0c;难免会将图像本身的细节进行重绘&#xff0c;尤其是在电商的场景中&#xff0c;文字和商品的细节很多时候会被重绘的乱七八糟。 针对这种情况&#xff0c;Comfyui-IC-Light节…

Elasticsearch的Restful风格API

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 1、Restful及JSON格式 RESTFUL是一种网络应用程序的设计风格和开发方式&#xff0c;基于HTTP&#xff0c;可以使用 XML 格式定义或 JSON 格式定义。R…

串行总线舵机

项目需求&#xff1a; 直接旋转&#xff1a;总体旋转角度方向 微调&#xff1a;步进模式/闭环电机模式 需要考虑受力之类的吗 初选方案&#xff1a; 只改写底层&#xff0c;然后引入官方驱动&#xff0c;通过各种函数 5、舵机如何实现在机械臂夹具中使用。 仅限夹取相同物…

开发台球助教小程序前景分析

开发台球助教小程序的前景分析可从以下维度展开探讨&#xff1a; 市场需求的增长 台球作为一项受欢迎的休闲运动&#xff0c;其爱好者群体正在扩大。随着大众对这项运动兴趣的增加&#xff0c;寻求系统化培训的需求也愈发明显。台球助教小程序正好填补了这一市场空白&#xf…

学习大数据DAY49 考后练习题

前几天在考帆软&#xff0c;考完后还有周末大礼包。 Oracle 上机练习 --第一题 create table 客户交易情况 ( 客户号 varchar2(5), 交易时间 varchar2(20),交易金额 number(5) ); --表中内容手动录入 select dense_rank()over(order by ascii(客户号)) as 序号 1,客户号, den…

MySQL插入更新死锁问题解析

文章目录 1 问题背景2 线上问题2.1 线上异常日志2.2 数据准备2.3 问题复现2.3.1 执行流程2.3.2 死锁排查 2.3.3 死锁日志分析2.3.3.1 事务A23087信息2.3.3.2 事务23087持有锁2.3.3.3 事务23087等待锁2.3.3.4 事务23088信息2.3.3.5 事务23088持有锁2.3.3.6 事务23088等待锁 3 分…

python进阶篇-day05-网络编程(TCP)与进程

day05网络编程 一. 网编三要素 ip 概述 设备(电脑, 手机, IPad, 耳机...)在网络中的唯一标识. 分类 按照 代数 划分: IPv4: 4字节, 十进制来表示, 例如: 192.168.13.157 IPv6: 8字节, 十六进制来表示, 理论上来讲, 可以让地球上的每一粒沙子都有自己的IP. Ipv4 常用类别划…

同三维S61-20SDI 20倍 HDMI SDI USB3.0 网口 3高清摄像机

同三维S61-20SDI 高清摄像机 20倍光学变焦&#xff0c; HDMI/SDI/USB3.0/网口&#xff0c;3.5音频口输入&#xff0c;350万像素 索尼机芯&#xff0c;支持POE&#xff0c;NDI HX2/Full NDI&#xff08;可定制&#xff09; 两款&#xff1a; S61-20SDI (不支持NDI) 单价&#…

1分钟 快速掌握 双向信号(inout信号)

​在数字电路设计中&#xff0c;三态门扮演着至关重要的角色。它是Verilog硬件描述语言中的一个基本元素&#xff0c;用于实现复杂电路的设计与模拟。 今天&#xff0c;我们一起来探讨三态门的基本原理、在Verilog中的实现方式。 一、什么是三态门? 三态门&#xff0c;简单…

fpga图像处理实战-边缘检测 (Roberts算子)

Roberts算子 Roberts算子是一种用于边缘检测的算子,主要用于图像处理中检测图像的边缘。它是最早的边缘检测算法之一,以其计算简单、速度快而著称。Roberts算子通过计算图像像素在对角方向的梯度来检测边缘,从而突出图像中灰度变化最剧烈的部分。 原理 Roberts算子通过…

力扣刷题(4)

正则表达式匹配 正则表达式匹配-力扣 思路来源&#xff1a;ithewei 若 *p 为空&#xff0c;*s 为空则匹配&#xff0c;*s 为非空则不匹配&#xff1b;当 *s为非空时&#xff0c;*p *s || *p ‘.’ 时第一个字符匹配&#xff1b;若 *(p1) ! ’ * 时&#xff0c;则递归判断…

python开发VTK入门

首先用pip命令安装VTK的python库&#xff1b; 需要一些时间&#xff0c;安装完成如下&#xff1b; 基本示例代码&#xff0c; import vtkcube vtk.vtkCubeSource() cube.SetXLength(100.0) cube.SetYLength(200.0) cube.SetZLength(300.0)mapper vtk.vtkPolyDataMapper() ma…