面试经典150题【11-20】

news2024/12/24 22:17:36

文章目录

  • 面试经典150题【11-20】
    • 388.O(1) 时间插入、删除和获取随机元素
    • 238.除自身以外数组的乘积
    • 134加油站
    • 135.分发糖果
    • 42. 接雨水
    • 13.罗马数字
    • 12.整数 转 罗马数字
    • 58.最后一个单词的长度
    • 14.最长公共前缀
    • 151.反转字符串中的单词

面试经典150题【11-20】

388.O(1) 时间插入、删除和获取随机元素

用一个哈希表和一个变长数组组成一个新的数据类型。
获取随机元素的话,直接random一个数然后从数组里取就行。
插入和删除的话,先判断有没有这个数,哈希表里存的是{ 数据:在变长数组中的索引}
插入的话直接插变长数组末尾,然后再在哈希表里插
删除的话,把最后一个元素放到要删除的位置,然后删除最后一个元素即可。哈希里的也要set一下然后删一下。

238.除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。

请 不要使用除法,且在 O(n) 时间复杂度内完成此题。

示例 1:

输入: nums = [1,2,3,4]
输出: [24,12,8,6]

以【1,2,3,4,5】来举例,对于3来说,可以让前面×1×后面
创建一个全为1的数组来代替1
双指针遍历两次,i指针代表前缀和,J指针代表后缀和

class Solution {
    public int[] productExceptSelf(int[] nums) {
        int n=nums.length;
        int[] ans=new int[n];
        Arrays.fill(ans,1);
        int beforesum=1,aftersum=1;
        for(int i=0,j=n-1;i<n;i++,j--){
            ans[i] *=beforesum;
            ans[j] *=aftersum;
            beforesum *=nums[i];
            aftersum *=nums[j];
        }
        return ans;
    }
}

134加油站

在这里插入图片描述
先建立一个差分数组,从头开始累加,累加失败后从失败数的后一位累加。累加N次成功即可。
时间复杂度O(2N)

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int n=gas.length;
        int []diff=new int[n];
        for(int i=0;i<n;i++){
            diff[i]=gas[i]-cost[i];
        }
       

        int ans=0,i=0;
        while(i<n){
            int sum=0,cnt=0;
            //cnt计数,cnt循环一圈应该是n
            while(cnt<n){
                sum+=diff[(i+cnt)%n];
                if(sum<0){
                    break;
                }
                cnt++;
            }

            if(cnt==n){
                return i;
            }else{
                //跳到负数之后的一位
                i+=cnt+1;
            }
        }

        return -1;
       

    }
}

135.分发糖果

在这里插入图片描述
先从左往右遍历一遍,再从右往左遍历(赋值的时候应该赋值Max)

class Solution {
    public int candy(int[] ratings) {
        int []ans=new int[ratings.length];
        ans[0]=1;
        for(int i=1;i<ratings.length;i++){
            if(ratings[i]>ratings[i-1]){
                ans[i]=ans[i-1]+1;
            }else{
                ans[i]=1;
            }
        }
        for(int i=ratings.length-2;i>=0;i--){
            if(ratings[i]>ratings[i+1]){
                ans[i]=Math.max(ans[i],ans[i+1]+1);
            }
        }
        int sum=0;
        for(int i=0;i<ratings.length;i++){
            sum+=ans[i];
        }
        return sum;

    }
}

或者用left[] 和right[] 两个数组来分别遍历两次
然后ans[]= Max(left,right)
这样也是满足从左到右和从右到左两个规则的最小值。

42. 接雨水

在这里插入图片描述
方法一:先算一个leftMax数组,再算一个rightMax数组。然后每个格子的存储水的量就等于
min(leftMax,rightMax) - height

class Solution {
    public int trap(int[] height) {
        int n = height.length;
        if (n == 0) {
            return 0;
        }

        int[] leftMax = new int[n];
        leftMax[0] = height[0];
        for (int i = 1; i < n; ++i) {
            leftMax[i] = Math.max(leftMax[i - 1], height[i]);
        }

        int[] rightMax = new int[n];
        rightMax[n - 1] = height[n - 1];
        for (int i = n - 2; i >= 0; --i) {
            rightMax[i] = Math.max(rightMax[i + 1], height[i]);
        }

        int ans = 0;
        for (int i = 0; i < n; ++i) {
            ans += Math.min(leftMax[i], rightMax[i]) - height[i];
        }
        return ans;
    }
}

如果是想调整为0(1)的空间复杂度的话,也是记录leftMax和rightMax两个变量。
当左边最高比右边最高低的时候,利用漏桶效应,是左边最高减去本地的height。
右边同理。

      while (left < right) {
            leftMax = Math.max(leftMax, height[left]);
            rightMax = Math.max(rightMax, height[right]);
            if (height[left] < height[right]) {
                ans += leftMax - height[left];
                ++left;
            } else {
                ans += rightMax - height[right];
                --right;
            }
        }

13.罗马数字

在这里插入图片描述
IV是15,所以是5-1,则后一个比前一个数字大,则前一个数字是减法。
否则就是加法,最后一个数字肯定是加法。

class Solution {
    public int romanToInt(String s) {
         int sum = 0;
        int preNum = symbolValues.get(s.charAt(0));
        for(int i = 1;i < s.length(); i ++) {
            int num = symbolValues.get(s.charAt(i));
            if(preNum < num) {
                sum -= preNum;
            } else {
                sum += preNum;
            }
            preNum = num;
        }
        sum += preNum;
        return sum;
    }

    Map<Character, Integer> symbolValues = new HashMap<Character, Integer>() {{
        put('I', 1);
        put('V', 5);
        put('X', 10);
        put('L', 50);
        put('C', 100);
        put('D', 500);
        put('M', 1000);
    }};
}

12.整数 转 罗马数字

硬编码没意义

58.最后一个单词的长度

没意思,注意一下最后可能有空格,先写个while循环把空格排除掉就行

14.最长公共前缀

在这里插入图片描述
无论是什么算法,肯定是O(MN)的复杂度。
依次遍历所有的字符串,选择求取公共字符串函数(目前的公共字符串,下一个普通字符串)即可

class Solution {
    public String longestCommonPrefix(String[] strs) {
        // 如果字符串数组为空,直接返回空字符串
        if (strs == null || strs.length == 0) {
            return "";
        }

        // 初始公共前缀为第一个字符串
        String commonPrefix = strs[0];

        // 遍历剩余的字符串
        for (int i = 1; i < strs.length; i++) {
            // 比较当前字符串与当前最长公共前缀,更新最长公共前缀
            commonPrefix = getCommonPrefix(commonPrefix, strs[i]);

            // 如果最长公共前缀已经为空,直接返回
            if (commonPrefix.equals("")) {
                return "";
            }
        }

        // 返回最长公共前缀
        return commonPrefix;
    }

    // 辅助函数,用于获取两个字符串的公共前缀
    private String getCommonPrefix(String str1, String str2) {
        int index = 0;
        // 找到两个字符串的公共前缀的长度
        while (index < str1.length() && index < str2.length() && str1.charAt(index) == str2.charAt(index)) {
            index++;
        }
        // 返回公共前缀
        return str1.substring(0, index);
    }
}

151.反转字符串中的单词

先把前后的空格删了,再从后到前提取每一个单词,再拼接所有的单词。
“ hello world ”–>“world hello”

class Solution {
    public static String reverseWords(String s) {
        StringBuilder ans = new StringBuilder();
        s = s.trim(); // 删除首尾的空格
        int j = s.length() - 1, i = j; // 开始的时候ij两个指针都在最右边
        while (i >= 0) {
            while (i >= 0 && s.charAt(i) != ' ')
                i--; // 搜索单词的最前面
            ans.append(s.substring(i + 1, j + 1) + " "); // 把新单词添加上
            while (i >= 0 && s.charAt(i) == ' ')
                i--; // 搜索单词的最后面
            j = i;
        }
        return ans.toString().trim();
    }
}

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

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

相关文章

IO进程:信号灯集

程序代码&#xff1a; sem.h: 1 #ifndef __SEM_H__2 #define __SEM_H__3 4 //创建信号灯集并初始化&#xff0c;semcount表示灯个数5 int open_sem(int semcount);6 7 //申请资源操作&#xff0c;semno表示灯的编号8 int P(int semid,int semno);9 10 //释放资源操作&#xff…

[LWC] Work with Data + Error Handling

目录 Overview Summary Use Cases for Interacting with Salesforce Data Handling Server Errors Sample Code Reference Overview Summary Use Cases for Interacting with Salesforce Data Handling Server Errors Sample Code Prerequisite: 1. Copy the ldsUtils f…

Python进阶学习:json.dumps()和json.dump()的区别

Python进阶学习&#xff1a;json.dumps()和json.dump()的区别 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您…

驻场人员严重划水,愈演愈烈,要请领导出面吗?

你有没有遇到过团队成员偷懒的情况&#xff1f;比如你们一起完成某个项目目标&#xff0c;干着干着你发现&#xff0c;就只有你和几个核心人员比较上心&#xff0c;很多人都在划水。 你可能会觉得这是因为大家工作态度不好&#xff0c;甚至怀疑他们的人品&#xff0c;忍不住想…

js里面有引用传递吗?

一&#xff1a;什么是引用传递 引用传递是相对于值传递的。那什么是值传递呢&#xff1f;值传递就是在传递过程中再复制一份&#xff0c;然后再赋值给变量&#xff0c;例如&#xff1a; let a 2; let b a;在这个代码中&#xff0c;let b a; 就是一个值传递&#xff0c;首先…

【Java程序设计】【C00276】基于Springboot的就业信息管理系统(有论文)

基于Springboot的就业信息管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的就业信息管理系统 本系统分为前台功能模块、管理员功能模块、学生功能模块、企业功能模块以及导师功能模块。 前台功能模块&…

勒索攻击新趋势,DarkSide解密工具

勒索攻击新趋势 2020年通过勒索病毒攻击已经成为网络犯罪分子热崇追捧的一种方式&#xff0c;全球几乎每天都有企业被勒索病毒攻击勒索&#xff0c;而且勒索的金额也越来越高&#xff0c;从几万美元到几千万美元不等&#xff0c;越来越多的黑客组织使用勒索病毒对企业发起攻击…

【python】学习笔记03-循环语句

3.1 whlie循环的基础语法 - while循环的语法格式 - while循环的注意事项 条件需提供布尔类型结果&#xff0c;True继续&#xff0c;False停止 空格缩进不能忘 请规划好循环终止条件&#xff0c;否则将无限循环 """ 演示while循环基础练习题&#xff1a;求1-10…

JSON:简介与基本使用

目录 什么是JSON&#xff1f; JSON的基本结构 JSON的基本使用 在JavaScript中使用JSON 创建JSON对象 解析JSON字符串 生成JSON字符串 在其他编程语言中使用JSON 总结 什么是JSON&#xff1f; JSON&#xff0c;全称为JavaScript Object Notation&#xff0c;是一种轻量…

matlab生成模拟的通信信号

matlab中rand函数生成均匀随机分布的随机数&#xff0c;randn生成正态分布的随机数&#xff1b; matlab来模拟一个通信信号&#xff1b; 通信信号通过信道时&#xff0c;研究时认为它会被叠加上服从正态分布的噪声&#xff1b; 先生成随机信号模拟要传输的信号&#xff0c;s…

C++基础知识(七:多态)

一、多态 常说的多态&#xff0c;是发生在类之间的多态 函数重载(静态多态/编译时多态) 类之间的多态(动态多态/运行时多态) 【1】前提 继承是多态的前提 虚函数 什么是多态&#xff1a;相同的代码&#xff0c;实现不同的功能 【2】函数重写(override) 必须有继承关系父类中必须…

python中的类与对象(2)

目录 一. 类的基本语法 二. 类属性的应用场景 三. 类与类之间的依赖关系 &#xff08;1&#xff09;依赖关系 &#xff08;2&#xff09;关联关系 &#xff08;3&#xff09;组合关系 四. 类的继承 一. 类的基本语法 先看一段最简单的代码&#xff1a; class Dog():d_…

JS防抖函数

场景 频繁触发耗时操作&#xff0c;仅关心最后一次的触发时使用防抖函数 代码 function debounce(fn , delay){let timer;return () > {clearTimeout(timer);timer setTimerout(()>{fn()},delay)} } 详解 触发一次函数&#xff0c;然后执行后续操作 function deboun…

消息中间件之RocketMQ源码分析(十七)

Broker CommitLog索引机制的数据结构 ConsumerQueue消费队列 主要用于消费拉取消息、更新消费位点等所用的索引。源代码参考org.apache.rocketmq.store.ConsumerQueue.该文件内保存了消息的物理位点、消息体大小、消息Tag的Hash值 物理位点:消息在CommitLog中的位点值消息体…

音乐格式转换软件有哪些?5款必备神器

音乐格式转换软件有哪些&#xff1f;音乐&#xff0c;作为人类情感的载体&#xff0c;伴随着我们生活的每一个角落。在享受音乐的同时&#xff0c;我们有时也面临着音乐格式不兼容的问题。不用担心&#xff0c;今天我将为大家揭秘五款音乐格式转换软件&#xff0c;让你的音乐之…

开发一套智慧工地系统需要多久时间?

什么是智慧工地&#xff1f; 智慧工地是智慧地球理念在工程领域的行业具现&#xff0c;是一种崭新的工程全生命周期管理理念。它运用信息化手段&#xff0c;通过三维设计平台对工程项目进行精确设计和施工模拟&#xff0c;围绕施工过程管理&#xff0c;建立互联协同、智能生产…

投资黄金在哪里买比较好?

黄金&#xff0c;作为一种传统的避险资产&#xff0c;历来受到投资者的青睐。在全球经济波动的大背景下&#xff0c;黄金的价值愈发凸显。那么&#xff0c;投资黄金在哪里买比较好呢&#xff1f;本文将重点探讨在香港黄金平台投资黄金的优势&#xff0c;并以金田金业为例&#…

外包工作两个月,技术退步让我决心改变

大家好&#xff0c;我是一名大专生&#xff0c;2019年通过校招进入了湖南的一家软件公司。在这里&#xff0c;我从事了接近4年的功能测试工作。然而&#xff0c;今年8月份&#xff0c;我深刻地意识到&#xff0c;我不能继续这样下去了。 长时间在一个舒适的环境里&#xff0c;…

ThreadLocal从使用到实现原理与源码详解

ThreadLocal概述 ThreadLocal是多线程中对于解决线程安全的一个操作类&#xff0c;它会为每个线程都分配一个独立的线程副本从而解决了变量并发访问冲突的问题。ThreadLocal 同时实现了线程内的资源共享。 案例&#xff1a;使用JDBC操作数据库时&#xff0c;会将每一个线程的…

Linux环境基础开发工具使用篇(三) git 与 gdb

一、版本控制器-git 1.简单理解: ①git既是服务端&#xff0c;又是客户端 ②git会记录版本的变化 ③git是一个去中心化的分布式软件 git/gitee 是基于git仓库搭建的网站&#xff0c;让版本管理可视化 2.git 三板斧提交代码 查看安装的git版本 git--version 命令行提交代…