Leetcode字符串专项,2024年最新2024我的Linux运维路要怎么走

输出: “LVIII”
解释: L = 50, V = 5, III = 3.
示例 5:

输入: num = 1994
输出: “MCMXCIV”
解释: M = 1000, CM = 900, XC = 90, IV = 4.


#### 实现思路


这道题目和13题是一个相互的过程,一个是整数转罗马数字,一个是罗马数字转整数,相比较之下,罗马数字转整数会更简单一点(下题目)。本题的话有一个实现过程,先理清楚这个对应关系:int numN[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};  
        char map[][3] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};


然后考虑转化过程,140有很多种分解方法,(140=100+40 140=50+50+40等),但对应过来就是先取大的大一个


#### 代码实现



char* intToRoman(int num) {
char* res = (char*)malloc(sizeof(char) * 100);
int numN[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
char map[][3] = {“M”, “CM”, “D”, “CD”, “C”, “XC”, “L”, “XL”, “X”, “IX”, “V”, “IV”, “I”};
int i = 0, index = 0;
while (num != 0) {
i=0;
while(numN[i]>num){
i++;
}
if (numN[i] <= num) {
num = num - numN[i];
for (int j = 0; j < strlen(map[i]); j++) {
res[index] = map[i][j];
index++;
}
}
}
res[index] = ‘\0’;
return res;
}



### [​​​​​​​​​​​​​​​​​​​13. 罗马数字转整数]( )


罗马数字包含以下七种字符: `I`, `V`, `X`, `L`,`C`,`D` 和 `M`。



字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000


例如, 罗马数字 `2` 写做 `II` ,即为两个并列的 1 。`12` 写做 `XII` ,即为 `X` + `II` 。 `27` 写做  `XXVII`, 即为 `XX` + `V` + `II` 。


通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 `IIII`,而是 `IV`。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 `IX`。这个特殊的规则只适用于以下六种情况:


* `I` 可以放在 `V` (5) 和 `X` (10) 的左边,来表示 4 和 9。
* `X` 可以放在 `L` (50) 和 `C` (100) 的左边,来表示 40 和 90。
* `C` 可以放在 `D` (500) 和 `M` (1000) 的左边,来表示 400 和 900。


给定一个罗马数字,将其转换成整数。




示例 1:
输入: s = “III”
输出: 3
示例 2:
输入: s = “IV”
输出: 4
示例 3:
输入: s = “IX”
输出: 9
示例 4:
输入: s = “LVIII”
输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:
输入: s = “MCMXCIV”
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.



#### 实现思路


这道题的实现思路很残暴,直接列举每一种可能出现的罗马数字的情况,遍历输出


#### 代码实现




int romanToInt(char* s) {
char map[]={‘I’,‘V’,‘X’,‘L’,‘C’,‘D’,‘M’};
int sum=0;
for(int i=0;i<strlen(s);i++){
if(s[i]==map[0]&&s[i+1]!=map[1]&&s[i+1]!=map[2]){
sum+=1;
}else if(s[i]==map[0]&&s[i+1]==map[1]){
sum+=4;i++;
}else if(s[i]==map[0]&&s[i+1]==map[2]){
sum+=9;i++;
}else if(s[i]==map[1]){
sum+=5;
}else if(s[i]==map[2]&&s[i+1]!=map[3]&&s[i+1]!=map[4]){
sum+=10;
}else if(s[i]==map[2]&&s[i+1]==map[3]){
sum+=40;i++;
}else if(s[i]==map[2]&&s[i+1]==map[4]){
sum+=90;i++;
}else if(s[i]==map[3]){
sum+=50;
}else if(s[i]==map[4]&&s[i+1]!=map[5]&&s[i+1]!=map[6]){
sum+=100;
}else if(s[i]==map[4]&&s[i+1]==map[5]){
sum+=400;i++;
}else if(s[i]==map[4]&&s[i+1]==map[6]){
sum+=900;i++;
}else if(s[i]==map[5]){
sum+=500;
}else if(s[i]==map[6]){
sum+=1000;
}
}
return sum;
}



### [14. 最长公共前缀]( )


编写一个函数来查找字符串数组中的最长公共前缀。


如果不存在公共前缀,返回空字符串 `""`。




示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”
示例 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:“”
解释:输入不存在公共前缀。



#### 实现思路


先找到最小的字符串,记录下它的长度min,然后依次遍历数组的第0-min个元素,如果有不相同的结束,如果能够正常退出,该最小字符串的长度就是最长的公共前缀


#### 代码实现




char* longestCommonPrefix(char** strs, int strsSize) {
int min=1000;
for(int i=0;i<strsSize;i++){
if(strlen(strs[i])<min)
{
min=strlen(strs[i]);
}
}
char *s=(char )malloc(sizeof(char)(min+1));
int flag=0,i;
for(i=0;i<min;i++){
s[i]=strs[0][i];
for(int j=1;j<strsSize;j++){
if(s[i]!=strs[j][i]){
flag++;
}
}
if(flag!=0){
break;
}
}
s[i]=‘\0’;
return s;
}



### [344. 反转字符串]( )


编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 `s` 的形式给出。


不要给另外的数组分配额外的空间,你必须**[原地]( )修改输入数组**、使用 O(1) 的额外空间解决这一问题。




示例 1:

输入:s = [“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]
示例 2:

输入:s = [“H”,“a”,“n”,“n”,“a”,“h”]
输出:[“h”,“a”,“n”,“n”,“a”,“H”]



#### 实现思路


双指针同时像中间移动


#### 代码实现




void reverseString(char* s, int sSize) {
for(int i=0;i<(sSize/2);i++){
int temp=s[i];
s[i]=s[sSize-1-i];
s[sSize-1-i]=temp;
}
}



### [541. 反转字符串 II]( )


给定一个字符串 `s` 和一个整数 `k`,从字符串开头算起,每计数至 `2k` 个字符,就反转这 `2k` 字符中的前 `k` 个字符。


* 如果剩余字符少于 `k` 个,则将剩余字符全部反转。
* 如果剩余字符小于 `2k` 但大于或等于 `k` 个,则反转前 `k` 个字符,其余字符保持原样。




示例 1:
输入:s = “abcdefg”, k = 2

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
img

最全的Linux教程,Linux从入门到精通

======================

  1. linux从入门到精通(第2版)

  2. Linux系统移植

  3. Linux驱动开发入门与实战

  4. LINUX 系统移植 第2版

  5. Linux开源网络全栈详解 从DPDK到OpenFlow

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

第一份《Linux从入门到精通》466页

====================

内容简介

====

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。

需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

fb6a92edea27b825e59aa1f2c54.png)

本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。

需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-NeZVxyLG-1712959660652)]

  • 26
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值