> 简洁易懂讲清原理,讲不清你来打我~

输入字符串,输出对应整数

![在这里插入图片描述](https://img-blog.csdnimg.cn/63802fda72be45eba98d9e4c99f0160b.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/0ce225c2d0e545e2abe9518d238a9429.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2cc144b3db264abba6e4057953b6d153.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/059524e826544166b0cf5f91d6bcc6f7.png)
简单的思路
罗马数字映射整数,遍历罗马字符串,当第i个对应的字符串小于第i+1个,减法,否则加法

精确的定义
RomanToNum是罗马字符映射数字的哈希表
i是字符串遍历到的当前下标
ans是罗马字符串对应的最终整数

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

> 简洁易懂讲清原理,讲不清你来打我~

Leetcode14. 最长公共前缀

输入字符串数组,输出字符串为公共前缀

![在这里插入图片描述](https://img-blog.csdnimg.cn/bb4bce9ed73940f79919032f0a043c13.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/53c5e14222af4fce9bb75e9f0334a4c3.png)

> 暴力

简单的思路
第一个作为模板,对每个字符数组进行匹配,对于每个字符串,从头到尾匹配,不能匹配或者超出最右时就不再匹配并更新最右边界

精确的定义
mostRight是最长公共前缀到最右的地方
right是两字符串公共前缀最右的地方
i是正在匹配的字符串下标
str1是拿来匹配的模板

```cpp
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.size()==0)return "";
string str1=strs[0];
int mostRight=str1.size();
for(int i=1;i<strs.size();i++){
int right=-1;
while(right+1<strs[i].size()&&right+1<=mostRight&&strs[i][right+1]==str1[right+1]){
right++;
}
mostRight=right;
}
if(mostRight==-1)return "";
return str1.substr(0,mostRight-0+1);
}
};
```

时间复杂度Omn,m是字符串平均长度,n是字符串数量,最差情况每个字符串每个字符都遍历

1

Leetcode15. 三数之和

数组找到3个元素,和为0,输出
![在这里插入图片描述](https://img-blog.csdnimg.cn/e5a7f0c4795e4a1e88e96dfcc7eada3f.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/4929d1540ae44f8d9cfe0cd0eeb0029c.png)
详细思路
sort,先找一个i,剩余两个从i右边开始,用双指针靠近找出所有满足的三元组,当i和i-1,left和left-1,right和right+1相同时continue;

精确的定义
i第一个元素下标
left第二个元素下标
right第三个元素下标
ans所有满足的数组

```cpp
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>>ans;
if(nums.size()<3)return ans;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size()-2;i++){
if(i-1>=0&&nums[i]==nums[i-1])continue;
int left=i+1,right=nums.size()-1;
while(left<right){
if(left-1>=i+1&&nums[left]==nums[left-1]){
left++;
continue;
}
else if(right+1<=nums.size()-1&&nums[right]==nums[right+1]){
right--;
continue;
}
if(nums[left]+nums[right]+nums[i]==0){
ans.push_back({nums[i],nums[left],nums[right]});
left++;
right--;
}
else if(nums[left]+nums[right]+nums[i]<0)left++;
else if(nums[left]+nums[right]+nums[i]>0)right--;
}
}
return ans;
}
};
```

踩过的坑
去重
```cpp
if(i-1>=0&&nums[i]==nums[i-1])continue;

if(left-1>=i+1&&nums[left]==nums[left-1]){
left++;
continue;
}
else if(right+1<=nums.size()-1&&nums[right]==nums[right+1]){
right--;
continue;
}
```
Leetcode16. 最接近的三数之和
![在这里插入图片描述](https://img-blog.csdnimg.cn/af4cf4dcea884377bf268f9252fe3a2a.png)
详细的思路
sort,对于每一个第一个元素,leftright两侧向中间逼近,保存最接近的和,绝对值更小的和要保存,大于的话right--小于的话left++

精确的定义
i第一个元素
left第二个元素
right第三个元素
ans最接近的和

```cpp
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
int ans=0x3f3f3f3f;
for(int i=0;i<nums.size()-2;i++){
int left=i+1,right=nums.size()-1;
while(left<right){
ans=abs(nums[i]+nums[left]+nums[right]-target)<abs(ans-target)?nums[i]+nums[left]+nums[right]:ans;
if(nums[i]+nums[left]+nums[right]==target)return target;
else if(nums[i]+nums[left]+nums[right]<target)left++;
else if(nums[i]+nums[left]+nums[right]>target)right--;
}
}
return ans;
}
};
```
踩过的坑

```cpp
int ans=0x3f3f3f3f;
```

Leetcode17. 电话号码的字母组合
![在这里插入图片描述](https://img-blog.csdnimg.cn/157d8ecc20f44fdd92cd9f38f6656815.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/22f7cece8bbd47da8b4c97ab2c718529.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/31c3ac0936eb4771807727c77d931322.png)

详细的思路
哈希表映射数字对应的字符串,从第0层开始,找到该层数字对应的字符串,遍历字符串,将第一个字符放到数组并进入下一层,或者不要这个字符而尝试第二个字符,当层数=最后一个数字也用完了就结束

精确的定义
numToStr哈希表数字映射字符串
depth递归层数,也是处理第几个数字
str该层对应的字符串
c字符串中的字符
ans1某一种组合
ans所有组合

```cpp
class Solution {
public:
unordered_map<char,string>numToStr={
{'2',"abc"},
{'3',"def"},
{'4',"ghi"},
{'5',"jkl"},
{'6',"mno"},
{'7',"pqrs"},
{'8',"tuv"},
{'9',"wxyz"}
};
vector<string> letterCombinations(string digits) {
if(digits.size()==0)return {};
vector<string>ans;
string ans1;
dfs(digits,ans,ans1,0);
return ans;
}
void dfs(const string&digits,vector<string>&ans,string&ans1,int depth){
if(depth==digits.size()){
ans.push_back(ans1);
return ;
}
string str=numToStr[digits[depth]];
for(auto c:str){
ans1.push_back(c);
dfs(digits,ans,ans1,depth+1);
ans1.pop_back();
}
}
};
```

> 喜欢简洁易懂还能讲清楚原理博客的小伙伴就关注关注这个非常高产的博主呀,下次再会~

Leetcode13. 罗马数字转整数Leetcode14. 最长公共前缀Leetcode15. 三数之和Leetcode16. 最接近的三数之和Leetcode17. 电话号码的字母组合的更多相关文章

  1. leetcode-14最长公共前缀

    leetcode-14最长公共前缀 题目 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower& ...

  2. [Swift]LeetCode14. 最长公共前缀 | Longest Common Prefix

    Write a function to find the longest common prefix string amongst an array of strings. If there is n ...

  3. LeetCode14.最长公共前缀

    编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...

  4. LeetCode14.最长公共前缀 JavaScript

    编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...

  5. leetcode14最长公共前缀

    class Solution { public: string longestCommonPrefix(vector<string>& strs) { ) return " ...

  6. leetcode14:最长公共字符串

    编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...

  7. Leetcode14._最长公共前缀

    题目 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow&q ...

  8. [LeetCode]14.最长公共前缀(Java)

    原题地址: longest-common-prefix 题目描述: 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入:st ...

  9. LeetCode 14. 最长公共前缀(Longest Common Prefix)

    14. 最长公共前缀 14. Longest Common Prefix 题目描述 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". Lee ...

随机推荐

  1. 目标检测数据集The Object Detection Dataset

    目标检测数据集The Object Detection Dataset 在目标检测领域,没有像MNIST或Fashion MNIST这样的小数据集.为了快速测试模型,我们将组装一个小数据集.首先,我们 ...

  2. mongodb的ObjectId最后三个字节有趣的地方

    ObjectId 由12个字节组成,其中组成如下: a 4-byte timestamp value, representing the ObjectId's creation, measured i ...

  3. 编译原理-NFA转化成DFA

    1.假定NFA    M=<S,∑,f,S0,F>    对M的状态转换图进行以下改造: ①引进新的初态结点X和终态结点Y,    X,Y∈S,    从X到S0中的任意结点连一条ε箭弧, ...

  4. HashMap源码解析和设计解读

    HashMap源码解析 ​ 想要理解HashMap底层数据的存储形式,底层原理,最好的形式就是读它的源码,但是说实话,源码的注释说明全是英文,英文不是非常好的朋友读起来真的非常吃力,我基本上看了差不多 ...

  5. 学废了系列 - WebGIS vs WebGL图形编程

    目前工作中有不少涉及到地图的项目,我参加了几次技术评审,前端伙伴们在 WebGIS 方面的知识储备稍有不足,这次分享的主要目的是科普一些在前端领域比较常用的 WebGIS 知识.另外,我之前的工作中积 ...

  6. 盘点用jQuery框架实现“for循环”的四种方式!

    摘要:分享在jQuery高级开发中对元素标签体的遍历常用的几种方法. 本文分享自华为云社区<盘点用jQuery框架实现"for循环"的四种方式!>,原文作者:灰小猿 . ...

  7. MySQL零散知识点(02)

    存储过程 存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql,类似于python中的自定义函数 基本使用 delimiter $$ crea ...

  8. 空闲时间研究一个小功能:winform桌面程序如何实现动态更换桌面图标

    今天休息在家,由于天气热再加上疫情原因,就在家里呆着,空闲时想着,在很早以前(约3年前),产品人员跟我提了一个需求,那就是winform桌面程序的图标能否根据节日动态更换,这种需求在移动APP上还是比 ...

  9. .Net Core with 微服务 - Seq 日志聚合

    上一次我们介绍并演示了如果使用 Consul 做为我们微服务的注册中心,来实现服务的注册与发现.那么本次我们讲会演示如何做日志聚合.日志聚合比较常用的有 ELK 等,但是这次我想要介绍的是一款比较小众 ...

  10. hackthebox TheNotebook

    前言 只拿到了user,提权没成功--有wp说是CVE-2019-5736,我没打成. 打点 nmap-sV -v -A 10.10.10.230 端口扫描结果: PORT STATE SERVICE ...