1、整数反转
题目
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
代码
class Solution {
public:
int reverse(int x) {
if(x==0)
return 0;
long int y=0;
int xx=x;
while(xx!=0){
y=y*10+xx%10;
xx/=10;
}
if(y>2147483647 || y<-2147483648){
return 0;
}
return y;
}
};
2、七进制数
题目
给定一个整数 num,将其转化为 7 进制,并以字符串形式输出。
示例 1:
输入: num = 100
输出: “202”
示例 2:
输入: num = -7
输出: “-10”
代码
class Solution {
public:
string convertToBase7(int num) {
if(num==0)
return "0";
string s;
bool is=num<0;
num = abs(num);
while(num>0){
s.push_back(num%7+'0');
num/=7;
}
if(is)
s.push_back('-');
reverse(s.begin(), s.end());
return s;
}
};
注:
push_back()函数用法:将一个新的元素加到vector的最后面,位置为当前最后一个元素的下一个元素,或者再string中最后插入一个字符;
pop_back() //移除最后一个元素
clear() //清空所有元素
empty() //判断vector是否为空,如果返回true为空
erase() // 删除指定元素
reverse(s.begin(), s.end()); 反转
例如:
vector vec;
vec.push_back(10);
string s ; s.push_back(123+‘0’);
3、 罗马数字转整数
题目
罗马数字包含以下七种字符: 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.
代码
class Solution {
public:
int romanToInt(string s) {
int re=0;
for(int i=0;i<s.length();i++){
if(s[i]=='I'&&s[i+1]!='V'&&s[i+1]!='X')
re+=1;
else if(s[i]=='I'&&s[i+1]=='V')
re-=1;
else if(s[i]=='I'&&s[i+1]=='X')
re-=1;
else if(s[i]=='V')
re+=5;
else if(s[i]=='X'&&s[i+1]!='L'&&s[i+1]!='C')
re+=10;
else if(s[i]=='X'&&(s[i+1]=='L'||s[i+1]=='C'))
re-=10;
else if(s[i]=='L')
re+=50;
else if(s[i]=='C'&&s[i+1]!='D'&&s[i+1]!='M')
re+=100;
else if(s[i]=='C'&&(s[i+1]=='D'||s[i+1]=='M'))
re-=100;
else if(s[i]=='D')
re+=500;
else if(s[i]=='M')
re+=1000;
}
return re;
}
};
4、最长公共前缀
题目
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”
示例 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:“”
解释:输入不存在公共前缀。
代码
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.size()==0)
return "";
string re=strs[0];
for(int i=1;i<strs.size();i++){
re = compare(re,strs[i]);
if(re=="")
break;
}
return re;
}
string compare(string s1,string s2){
int len=min(s1.length(),s2.length());
int index=0;
while(index<len && s1[index]==s2[index]){
index++;
}
return s1.substr(0,index);
}
};
5、有效的括号
题目
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([)]”
输出:false
示例 5:
输入:s = “{[]}”
输出:true
代码
class Solution {
public:
bool isValid(string s) {
int n = s.size();
stack<char> myst;
if(n%2==1)
return false;
for(int i=0;i<n;i++){
if(s[i]=='(' || s[i]=='[' || s[i]=='{')
myst.push(s[i]);
else if(s[i]==')'&& !myst.empty()){
if(myst.top()=='(')
myst.pop();
else
myst.push(s[i]);
}
else if(s[i]==']' && !myst.empty()){
if(myst.top()=='[')
myst.pop();
else
myst.push(s[i]);
}
else if(s[i]=='}' && !myst.empty()){
if(myst.top()=='{')
myst.pop();
else
myst.push(s[i]);
}
else
return false;
}
if(myst.empty())
return true;
else
return false;
}
};
6、无重复字符的最长子串
题目
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_set<char> occ;
int n = s.size();
int rr=0,ans=0;
for(int i = 0;i<n;i++){
if(i !=0 ){
occ.erase(s[i-1]);
}
while(rr < n && !occ.count(s[rr])){
occ.insert(s[rr]);
rr++;
}
ans=max(ans,rr-i);
}
return ans;
}
};
笔记
set.
count()
:判断元素是否存在于set集合中,若存在则输出为1,若不存在输出为0
set.
rease(i)
:移除集合中序号为 i 的元素,rease(first,last):移除[first,last)的元素
set.
insert()
:往集合中插入元素
set.
find()
:寻找集合中的某个元素,返回其序列