面试经典150题

news2024/11/24 8:31:11

打家劫舍

class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();
        if(n == 1){
            return nums[0];
        }
        vector<int> dp(n, 0);
        dp[0] = nums[0];//有一间房可以偷
        //有两间房可以偷
        if(nums[1] > nums[0]){
            dp[1] = nums[1];
        }else{
            dp[1] = nums[0];
        }
        for (int i = 2; i < n; i++) {
            dp[i] = max(dp[i-1], dp[i-2]+nums[i]);
        }
        return dp[n-1];
    }
};

买股票的最佳时机

一次遍历

在这里插入图片描述

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int minPrice = INT_MAX, sum = 0;
        for(int price:prices){
            sum = max(sum, price-minPrice);
            minPrice = min(minPrice,price);
        }
        return sum;
    }
};

买股票的最佳时机二

给一个整数数组prices,其中prices[i]表示第i天价格。
动态规划
dp[i][0]:表示第i天交易完后手里没有股票的最大利润,dp[i][1]表示第i天交易完后手里持有一只的最大利润。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        if(n == 1){
            return 0;
        }
        
        vector<vector<int>> dp(n, vector<int>(2,0));

        dp[0][0] = 0;
        dp[0][1] = -prices[0];
        for(int i=1; i<n; i++){
            //dp[i][0],第i-1天就没有,或者第i天卖了
            dp[i][0] = max(dp[i-1][0], dp[i-1][1]+prices[i]);
            //dp[i][1],第i-1天没有,第i天买了
            dp[i][1] = max(dp[i-1][0]-prices[i], dp[i-1][1]);
        }
        return max(dp[n-1][0], dp[n-1][1]);
    }
};

跳跃游戏

求到达nums[n-1]的最小跳跃次数。

class Solution {
public:
    int jump(vector<int>& nums) {
        int n = nums.size();
        vector<int> dp(n, INT_MAX);
        dp[0] = 0;
        for(int i=0; i<n; i++){
            for(int j=i+1; j<=i+nums[i] && j<=n-1; j++){
                dp[j] = min(dp[j], dp[i]+1);
            }
        }
        return dp[n-1];
    }
};

H指数

数组citations表示研究者第i篇论文被引用的次数,计算并返回研究者的h指数。

至少发表h篇论文,至少有h篇论文被引用次数大于等于h。

class Solution {
public:
    int hIndex(vector<int>& citations) {
        int n = citations.size();
        int h = n;
        sort(citations.begin(), citations.end());
        while(h){
            int count = 0;
            for(int i=n-1; i>=0; i--){
                if(citations[i] >= h){
                    count++;
                }
            }
            if(count >= h){
                return h;
            }
            h--;
        }
        return 0;
    }
};

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

实现RandomizedSet类
变长数组+哈希表
这道题要求实现一个类,满足插入、删除和获取随机元素操作的平均时间复杂度O(1)。

变长数组和哈希表结合,变长数组中存储元素,哈希表中记录每个元素在变长数组中的下标。

class RandomizedSet {
private:
    vector<int> nums;
    unordered_map<int, int> indices;
public:
    RandomizedSet() {
        srand((unsigned)time(NULL));
    }
    
    bool insert(int val) {
        if(indices.count(val)){
            return false;
        }
        nums.push_back(val);
        indices[val] = nums.size()-1;
        return true;
    }
    
    bool remove(int val) {
        if(indices.count(val)){
            int index = indices[val];
            int last = nums.back();
            nums[index] = last;
            indices[last] = index;
            nums.pop_back();
            indices.erase(val);
            return true;
        }
        return false;
    }
    
    int getRandom() {
        int randomIndex = rand()%nums.size();
        return nums[randomIndex];
    }
};

/**
 * Your RandomizedSet object will be instantiated and called as such:
 * RandomizedSet* obj = new RandomizedSet();
 * bool param_1 = obj->insert(val);
 * bool param_2 = obj->remove(val);
 * int param_3 = obj->getRandom();
 */

除自身以外数组的乘积

要求不使用除法,并且在O(n)时间复杂度内完成
左右乘积列表
我们不必将所有数字的乘积除以给定索引处的数字得到相应的答案,而是利用索引左侧所有数字的乘积和右侧所有数字的乘积相乘得到答案。

  1. 初始化两个空数组L和R,L[i]表示左侧乘积,R[i]表示右侧乘积
class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n = nums.size();
        vector<int> res(n,1);
        vector<int> left(n);
        vector<int> right(n);

        left[0] = 1;
        right[n-1] = 1;
        for(int i=1; i<n; i++){
            left[i] = left[i-1] * nums[i-1];
        }
        for(int i=n-2; i>=0; i--){
            right[i] = right[i+1] *nums[i+1]; 
        }
        for(int i=0; i<n; i++){
            res[i] = left[i]*right[i];
        }
        return res;
    }
};

罗马数字转整数

class Solution {
private:
    unordered_map <char,int> map1 = {
        {'I',1},
        {'V',5},
        {'X',10},
        {'L',50},
        {'C',100},
        {'D',500},
        {'M',1000}
    };
public:
    int romanToInt(string s) {
        int sum = 0;
        for(int i=0; i<s.size(); i++){
            char c = s[i];
            if(i < s.size()-1 && map1[c] < map1[s[i+1]]){
                sum -= map1[c];
            }else{
                sum += map1[c];
            }
        }
        return sum;
    }
};

两数之和二——输入有序数组

给你一个下标从1开始的整数数组numbers,该数组已按非递减顺序排列。
左右指针

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        int left = 0;
        int right = numbers.size()-1;
        while(left < right){
            if(numbers[left] + numbers[right] == target){
                return {left+1, right+1};
            }else if(numbers[left] + numbers[right] > target){
                right--;
            }else{
                left++;
            }

        }
        return {1,2};
    }
};

长度最小的子数组

给定一个含有n个正整数的数组和一个正整数target。
找出该数组中满足其总和大于等于target的长度最小的子数组,并返回长度。如果不存在符合条件的子数组,返回0。

滑动窗口
定义两个指针start和end分别表示子数组(滑动窗口的开始位置和结束位置),维护变量sum存储子数组中的元素和。

初始状态下,start和end都指向下标0,sum的值为0。

每一轮迭代,将nums[end]加到sum,如果sum≥s,则更新子数组的最小长度(此时子数组的长度是end-start+1)

给定一个含有n个正整数的数组和一个正整数target。
找出总和大于等于target的最小子数组的长度,如果没有,返回0。

class Solution{
public:
	int minSubArrayLen(int target, vector<int>& nums){
		int n = nums.size();
		int start = 0;
		int end = 0;
		int sum = 0;
		int ans = INT_MAX;
		while(end < n){
			sum += nums[end];
			while(sum >= target){
				ans = min(ans, end-start+1);
				sum -= nums[start];
				start++;
			}
			end++;
		}
		return ans==INT_MAX ? 0:ans;
	}
};

无重复字符的最长子串

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_set<char> set1;
        int start = 0;
        int end = 0;
        int n = s.size();
        int ans = 0;
        while(end < n){
            //如果最后一个字符不在已有的字符串中,则添加
            if(!set1.count(s[end])){
                set1.insert(s[end]);
                ans = max(ans, end-start+1);
                end++;
            }else{
                while(set1.count(s[end])){
                    set1.erase(s[start]);
                    start++;
                }
            }
        }
        return ans;
    }
};

单词规律

给定一种规律pattern和一个字符串s,判断s是否遵循相同的规律。

class Solution{
public:
	bool wordPattern(string pattern, string s){
		unordered_map<char, string> chToStr;
		unordered_map<string, char> strToCh;

		vector<string> strVector;
		istringstream iss(s);
		string word;
		while(iss >> word){
			strVector.push_back(word);
		}
		
		//检查长度
		if(pattern.size() != strVector.size()){
			return false;
		}

		for(int i=0; i<pattern.size(); i++){
			char ch = pattern[i];
			string str = strVector[i];

			//字符到字符串映射
			if(chToStr.count(ch)){
				if(chToStr[ch] != str){
					return false;
				}
			}else{
				chToStr[ch] = str;
			}

			//字符串到字符映射
			if(strToCh.count(str)){
				if(strToCh[str] != ch){
					return false;
				}
			}else{
				strToCh[str] = ch;
			}
		}
		return true;
	}
};

插入区间

给一个无重叠的,按照区间起始端点排序的区间列表intervals。

class Solution {
public:
    vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
        vector<vector<int>> res;
        int n = intervals.size();
        int i;
        //前半段
        for(i=0; i<n; i++){
            if(intervals[i][1] < newInterval[0]){
                res.push_back(intervals[i]);
            }else{
                break;
            }
        }
        //中间
        for(i; i<n; i++){
            if(intervals[i][0] <= newInterval[1]){
                newInterval[0] = min(intervals[i][0], newInterval[0]);
                newInterval[1] = max(intervals[i][1], newInterval[1]);
            }else{
                break;
            }
        }
        res.push_back(newInterval);
        //尾部
        for(i; i<n; i++){
            res.push_back(intervals[i]);
        }
        return res;
    }
};

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

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

相关文章

MySQL----InooDB行级锁、间隙锁

行级锁 行锁&#xff0c;也称为记录锁&#xff0c;顾名思义就是在记录上加的锁。 注意&#xff1a; InnoDB行锁是通过给索引上的索引项加锁来实现的&#xff0c;而不是给表的行记录加锁实现的&#xff0c;这就意味着只有通过索引条件检索数据&#xff0c;InnoDB才使用行级锁…

电商API接口是什么意思?有什么作用?

电商API接口是电子商务领域中一种技术解决方案&#xff0c;它允许不同的软件系统之间进行交互和数据交换。 在电商场景下&#xff0c;电商API接口可以实现的功能非常丰富&#xff0c;例如&#xff1a; 商品管理&#xff1a;获取商品列表、商品详情、搜索商品、上下架商品等&a…

vue页面前端初始化表格数据时报错TypeError: data.reduce is not a function

这是初始化表格数据时报的错 。 [Vue warn]: Invalid prop: type check failed for prop "data". Expected Array, got Object found in---> <ElTable> at packages/table/src/table.vue<List> at src/views/org/List.vue<Catalogue> at src/v…

lombok不起作用排查

1.idea中lombok插件已安装并启用 2.idea中annotation processors已勾选 3.项目中gradle或maven已引入lombok依赖 但提示还是找不到get,set方法。 还需要启用annotationProcessor 重点是annotationProcessor的配置&#xff0c;没有配置这个才是问题出现的关键&#xff01;&…

四川古力未来科技有限公司抖音小店解锁电商新机遇

在数字化浪潮席卷全球的今天&#xff0c;电商行业正以前所未有的速度蓬勃发展。四川古力未来科技有限公司紧跟时代步伐&#xff0c;积极拥抱变革&#xff0c;在抖音平台上开设小店&#xff0c;为品牌发展注入了新的活力。那么&#xff0c;四川古力未来科技有限公司抖音小店究竟…

6.S081——CPU调度部分(Xv6中的进程的状态转换)——xv6源码完全解析系列(11)

0.briefly speaking 时隔9个月&#xff0c;我又回来继续更新Xv6内核源码相关的内容了&#xff0c;上次更新之后经历了3个月的秋招&#xff0c;之后紧接着是实验室的中期检查&#xff0c;之后又是遥遥无期的毕业论文写作和修改&#xff0c;总算到现在有了一些自己的时间来继续做…

Kotlin 实战小记:No-Arg 引用解决 No constructor found的问题

一、问题 新的项目试用一下kotlin, 调用数据库查询数据的时候报了这个问题&#xff1a;org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: No constructor found in com.neusoft.collect.entity.cm.CmRoom matc…

AMEYA360代理品牌 | 思瑞浦发布高精度12位8通道SAR ADC-TPC502200

聚焦高性能模拟芯片和嵌入式处理器的半导体供应商思瑞浦3PEAK(股票代码&#xff1a;688536)全新推出TPC502200&#xff0c;支持I2C接口的12位8通道SAR ADC。 TPC502200集成了高精度基准源&#xff0c;同时可在极端温度范围(-40C至125C)下稳定工作。TPC502200凭借强大的性能优势…

前端工具篇

在线工具 https://tool.lu/ 程序员工具箱 http://tool.pfan.cn/apitest 配色 https://webkul.github.io/coolhue/ 在线字符串和16进制互转 https://kw360.net/ox2str/ 代码美化截图 https://carbon.now.sh/?bgrgba 菜鸟工具 https://www.jyshare.com/ 文件格式转换 htt…

【Altium】PCB设计中如何设置同一网络的间距规则

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标&#xff1a; 对同一网络的各个元素间设置间距规则 2、应用场景&#xff1a; PCB设计规则中&#xff0c;当对网络设置间距规则时&#xff0c;默认的约束对象是不同的网络之间才生效&#xff0c;在一些特殊情况下&am…

关系模式的规范化设计概述-认识“好”的数据库模式、数据依赖

一、引言 前面学习了关系数据库的基本概念&#xff0c;关系模型的组成要素&#xff0c;关系数据库的标准查询语言SQL 三部分的内容&#xff0c;为了使得关系模式设计能够有一个标准&#xff0c;Codd提出了指导关系模式设计的规范 理论 二、为学生选课数据库添加院系表 1、…

[巨详细]安装HBuilder-X教程

文章目录 下载HBuilder-X点击网址 &#xff0c;打开官网先点击所有产品&#xff0c;再点击HBuilder-X。进入HBuilder-X官网页面点击more&#xff0c;选择适合的版本下载。等待下载打开压缩包&#xff0c;点击HBuilderX.exe选择喜欢的风格关闭该弹窗&#xff0c;选择创建就创建成…

郑州设计资质延续流程:人员社保的审核标准是什么?

郑州设计资质延续流程中&#xff0c;人员社保的审核标准如下&#xff1a; 一、社保缴纳期限 审核标准&#xff1a;人员&#xff08;技术负责人、注册人员等&#xff09;的社保考核期限恢复为3个月。需要提供相关人员至少连续3个月的社保缴纳记录。 二、社保缴纳主体 审核标准…

【Pandas驯化-06】一文搞懂Dataframe中的索引stack、unstack问题

【Pandas驯化-06】一文搞懂Dataframe中的索引stack、unstack问题 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 相关内容文档获取 微信公…

macbook屏幕录制技巧,这2个方法请你收好

在当今数字化时代&#xff0c;屏幕录制成为了一项不可或缺的技能&#xff0c;无论是教学演示、游戏直播&#xff0c;还是软件操作教程&#xff0c;屏幕录制都能帮助我们更直观地传达信息。MacBook作为苹果公司的标志性产品&#xff0c;其屏幕录制功能也备受用户关注。本文将详细…

GeoJson 地图地理信息数据获取

效果图&#xff1a; 获取渠道&#xff1a; 通过阿里数据可视化平台获取通过Vector Maps获取通过geojson来获取 1、通过阿里数据可视化平台获取 2、通过Vector Maps获取 3、通过geojson获取

618数码好物有哪些?热门榜单强势出炉

大家好&#xff01;随着6.18购物狂欢节的来临&#xff0c;我可以明白在面对非常吸引人的商品时&#xff0c;“选择困难症”就上来了。因此&#xff0c;为了帮助大家在这场购物盛事中有方向&#xff0c;我特意结合个人使用体验和市场研究&#xff0c;为大家筛选了几件既具有超高…

【启明智显产品介绍】Model4 工业级HMI芯片详解系列专题(一):芯片性能

Model4 工业级HMI芯片详解系列专题&#xff08;一&#xff09;【芯片性能】 Model4系列工业级MPU是国产自主面向工业应用的RISC-V架构的应用级芯片&#xff0c;内置玄铁64bit RISC-V CPU C906&#xff0c;主频高达600MHz&#xff0c;算力约1380DMIPS。 Model4系列工业级MPU具…

课程设计——基于FPGA的交通红绿灯控制系统(源代码)

摘要&#xff1a; 本课程设计旨在设计一个基于FPGA&#xff08;现场可编程门阵列&#xff09;的交通红绿灯控制系统。该系统模拟了实际道路交叉口的红绿灯工作场景&#xff0c;通过硬件描述语言&#xff08;如Verilog或VHDL&#xff09;编写源代码实现。系统包含三个主要部分&a…

DAY6-力扣刷题

1.下一个排列 31. 下一个排列 - 力扣&#xff08;LeetCode&#xff09; 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组…