剑指offer五道题,C++实现,看看自己能不能解出来。

news2024/11/29 2:37:53

第一道(剑指offer46 把数字翻译成字符串)
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。

示例:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”

代码实现:
用得是动态规划的思想。

class Solution {
public:
    int translateNum(int num) {
        int a = 1;
        int b = 1;  //滚动变量
        int c = 0;
        string str = to_string(num);

        if(num <= 9) return 1;
        for(int i = 2; i <= str.size(); i++)
        {
            int tem = 10 * (str[i-2] - '0') + (str[i - 1] - '0');
            if(tem>= 10 && tem <= 25)
            {
                 c = a + b;  //动态规划的关系式,c表示有多少种方案,等于除去最后一位的方案 加上 如果除去最后两位组成的数合理的方案
            }
            else
            {
                c = b;
            }
            a = b;
            b = c; //迭代
        }
        return c;
    }
};

在这里插入图片描述

第二道(剑指offer47 礼物的最大价值)
在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 12
解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物

代码实现:方法一

class Solution {
public:
    int maxValue(vector<vector<int>>& grid) {
        int n = grid.size();//行
        int m = grid[0].size();//列
        vector< vector<int> > dp(n, vector<int>(m));   // dp的含义:表示第i,j位的最大价值为多少
        dp[0][0] = grid[0][0]; 

        for(int i = 1; i < n ; i++)  //求出动态规划的初始值 dp[i][0]  dp[0][j]
        {
            dp[i][0] = dp[i - 1][0] + grid[i][0];
        }

        for(int j = 1; j < m; j++)
        {
            dp[0][j] = dp[0][j - 1] + grid[0][j];
        }

        for(int i = 1; i < n; i++)
        {
            for(int j = 1; j < m; j++)
            {
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]; //关系式  从右边 从上边 看谁大谁加入dp中
            }
        }

        return dp[n - 1][m - 1];
    }
};

方法二

class Solution {
public:
    int maxValue(vector<vector<int>>& grid) {
        int n = grid.size();//行
        int m = grid[0].size();//列
        int* dp = new int[m];     //空间复杂度优化成m   还可以优化成O(1)
        dp[0] = grid[0][0]; 

        for(int j = 1; j < m; j++)
        {
            dp[j] = dp[j - 1] + grid[0][j];
        }

        for(int i = 1; i < n; i++)
        {
            dp[0] = dp[0] + grid[i][0];
            for(int j = 1; j < m; j++)
            {
                dp[j] = max(dp[j], dp[j - 1]) + grid[i][j]; 
            }
        }
        return dp[m - 1];
    }
};

在这里插入图片描述

第三题(剑指offer48 最长不含重复字符的子字符串)

题目描述:
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

示例:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

代码实现:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
    if (s == "") return 0;
	if (s.length() == 1) return 1;

	unordered_map<char, int> position;
	vector<int> dp(s.length(), 0);
	int res = 0, count = 0;
	for (int i = 0; i < s.length(); i++) { 
		if (i != 0 && position.find(s[i]) == position.end()) {
			dp[i] = dp[i - 1] + 1;
		}
		else if (i == 0) {
			dp[i] = 1;
		}
		else {
			int j = position[s[i]];
			if (i - j <= dp[i - 1]) {
				dp[i] = i - j;
			}
			else {
				dp[i] = dp[i - 1] + 1;
			}
		}
		position[s[i]] = i;
        res = max(res, dp[i]);
	}
	return res;
    }
};

第四题(剑指offer49 丑数)
题目描述:
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。

示例:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。

代码实现:

class Solution {
public:
    int nthUglyNumber(int n) {
        int a=1, b=1, c=1;
        int* dp = new int[n + 1];
        dp[1] = 1;

        for(int i = 2; i <= n; i++)
        {
            dp[i] = min(min(dp[a] * 2, dp[b] * 3), dp[c] * 5);
            if(dp[i] == dp[a] * 2) a++;
            if(dp[i] == dp[b] * 3) b++;
            if(dp[i] == dp[c] * 5) c++;
        }

        return dp[n];
    }
};

在这里插入图片描述

第五题剑指offer50 第一个只出现一次的字符
题目描述:
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。

示例:
输入:s = “abaccdeff”
输出:‘b’

输入:s = “”
输出:’ ’

代码实现:

class Solution {
public:
    char firstUniqChar(string s) {
        if(s.size() == 0) return' ';
        unordered_map<int, int> map;
        for(auto ch : s)
        {
            map[ch]++;
        }
        for(auto ch : s)
        {
            if(map[ch] == 1) return ch;
        }
        return' ';
    }
};

在这里插入图片描述

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

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

相关文章

在产业互联网诞生之初,其仅被当成是互联网的衍生品和避风港

在流量和资本的红利已然被出清的大背景下&#xff0c;以平台经济为代表的互联网经济的发展同样被逼退到了进退维谷的境地里。如何突破以往发展模式的束缚&#xff0c;如何让互联网行业的发展重新开启新的想象空间&#xff0c;成为每一个互联网玩家必然需要思考的重要课题。于是…

python 列表生成式

列表生成式 列表生成式的结构是在一个中括号里包含一个表达式,然后是一个for语句,然后是0个或多个for或者if语句。列表表达式可以是任意的,意思是你可以在列表中放入任意类型的对象。返回结果将是一个新的列表 # 去除偶数 hh[[1,2,3],[4,5,6],[7,8,9] ]#从做往右读就行 print…

Rpc了解

1、为什么要有rpc? 因为微服务之间需要进行服务间的通信&#xff0c;不同服务之间的接口要互相调用。而常见的通信协议主要有 RPC 和 REST 协议 使用rpc的好处是&#xff1a; 引入RPC框架对我们现有的代码影响最小&#xff0c;同时又可以帮我们实现架构上的扩展 两者对比 …

【7】SCI易中期刊推荐——计算机 | 人工智能(中科院4区)

🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…

Barra模型因子的构建及应用系列二之Beta因子

一、摘要 在前期的Barra模型系列文章中&#xff0c;我们初步讲解并构建了Size因子。在Size因子基础上构建的单因子策略也获得了不错的绝对收益。而本期内容&#xff0c;我们在该系列下进一步构建Beta因子&#xff0c;其中基于Beta因子构建的策略在2022年实现了5.70%年化收益&a…

51单片机——点亮LED

目录 LED基本参数 参数信息 参数解读 拉电流与灌电流 电路示意图 电阻选取 灌电流与拉电流区别 程序编写与现象展示 LED基本参数 参数信息 产品名称贴片发光二极管产品型号0603发光颜色 绿、红、蓝、翠绿、白、黄 电压2V~3.3V电流5~20mA功率0.01~0.06W使用寿命约50000小…

小程序模板语法

小程序模板语法模板语法—数据绑定数据绑定的步骤应用场景示例模板语法—条件渲染条件渲染的两个方式wx:if vs hidden列表渲染—基础列表渲染简介基础用法手动指定索引和当前项的变量名列表渲染—进阶key的作用key的用法模板语法—数据绑定 数据绑定的步骤 在data中定义数据 P…

Unreal中Interface接口的使用

通过继承Unreal中的接口可以使不同的类有某种共同特性,这里记录一下接口的使用方式。Unreal中的接口分为两种:C接口和蓝图接口,C接口可在蓝图中使用;蓝图中的接口不能直接在C中使用,这里探究一下他们的关系:1.C的接口在C中使用:新建C类,继承UnrealInterface:接口中可以声明虚函…

Java运算符(二)

算术运算符1.1运算符和表达式运算符&#xff1a;对常量和变量进行操作的符号表达式&#xff1a;用运算符把常量或者变量连接起来符合java语法的式子就可以成为表达式不同运算符连接的表达式体现的是不同类型的表达式举例说明&#xff1a;int a10;int b20;int cab;&#xff1a;是…

电脑投影左右切换

要同时使用几个显示器的情况 winp 投影 然后右键桌面 显示设置 长按选择左右屏幕

DRR(Digitally Reconstructured Radiograph)分类及原理

DRR(Digitally Reconstructured Radiograph)分类及原理 DRR(Digitally Reconstructured Radiograph)&#xff0c;全称为数字重建放射影像&#xff0c;其是通过将三维 (3D) 图像&#xff08;Volume&#xff09;透视投影到二维 (2D) 图像平面上而生成的射线照相图像的模拟。DRR被…

Oracle客户端 PL/SQL Developer:

1、配置文件进行导入导出 2、提示“ORA-00900: 无效 SQL 语句“解决方法 在PL/SQL中的SQL窗口用desc想显示指定表格abs_generl.prodord_sku的结构&#xff0c;提示无效语句 PL/SQL切换到命令窗口&#xff0c;再用desc显示表格abs_generl.prodord_sku的结构&#xff0c;执行成功…

2023年面试题之Dubbo基础

1. 为什么要用 Dubbo&#xff1f;随着服务化的进一步发展&#xff0c;服务越来越多&#xff0c;服务之间的调用和依赖关系也越来越复杂&#xff0c;诞生了面向服务的架构体系(SOA)&#xff0c;也因此衍生出了一系列相应的技术&#xff0c;如对服务提供、服务调用、连接处理、通…

libtorch c++ 使用预训练权重(以resnet为例)

任务&#xff1a; 识别猫咪。 目录 1. 直接使用 1.1 获取预训练权重 1.2 libtorch直接使用pt权重 2. 间接使用 2.1 BasicBlock 2.2 实现ResNet 2.3 BottleNeck 1. 直接使用 1.1 获取预训练权重 比如直接使用Pytorch版的预训练权重。先把权重保存下来&#xff0c;并打印…

vue+element详细完整实现个人博客、个人网站

一.前言 博客成品在线预览&#xff1a;点击访问 接上一篇《vueelementui实现非常好看的博客、网站首页&#xff0c;网站模板》。 上一篇实现了整个框架的搭建和首页的编码&#xff0c;在此基础上&#xff0c;这一期进行了最终的功能页面完善&#xff0c;增加了功能&#xff1a…

【自学Python】Python合并字符串

Python合并字符串 Python合并字符串教程 在开发过程中&#xff0c;很多时候我们有合并 字符串 的需求&#xff0c;即把一个 元祖 或 列表 中包含的多个字符串连接成一个字符串。这个操作是 分割字符串 的逆操作。 在 Python 中&#xff0c;合并字符串我们使用 join() 函数。…

过气明星李嘉明和《丁香花》唐磊,找哪个录制祝福视频值100万

说起娱乐圈的明星&#xff0c;给人的感觉都是光鲜亮丽&#xff0c;因为他们有流量有热度&#xff0c;想要赚钱就太容易了。过去的娱乐圈明星&#xff0c;都是靠自己的专业赚钱&#xff0c;比如说你是著名歌星&#xff0c;就要靠唱歌赚钱&#xff0c;如果你是影视明星&#xff0…

天天都接触的以太网接口,你知道有哪些类型和参数吗?

以太网接口简介 以太网接口是一种用于局域网组网的接口&#xff0c;包括&#xff1a;以太网电接口、以太网光接口。 为了适应网络需求&#xff0c;设备上定义了以下几种以太网接口类型&#xff1a; 二层以太网接口 是一种物理接口&#xff0c;工作在数据链路层&#xff0c;不…

ASP.NET Core 3.1系列(30)——Newtonsoft.Json实现JSON的序列化和反序列化

1、前言 在早期版本的ASP.NET Core项目中&#xff0c;Newtonsoft.Json的使用率非常高。虽然微软当前主推System.Text.Json来处理JSON的序列化和反序列化&#xff0c;但Newtonsoft.Json在这方面做的也是相当不错&#xff0c;下面就来介绍一下它的用法。 2、引入Newtonsoft.Jso…

echarts柱状图值为0是不显示以及柱状图百分比展示

echarts柱状图值为0是不显示以及柱状图百分比展示 1.效果展示 2.代码 <template><div id"container"><div id"main"></div></div> </template> <script>import * as echarts from echarts import * as lodash…