前言
- 题目前标号即为leetcode中对应的题号
- 此文是刷题后的个人总结
1.两数之和
题目
给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
//此处填写解答
}
};
思路
一开始想暴力结果超时
/*buggy code*/
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> tmp;
int t=nums.size();
for(int i=0;i<t-1;i++){
for(int j=i+1;j<t;j++){
if(nums[i]+nums[j]==target){
tmp.push_back(i);
tmp.push_back(j);
return tmp;
}
}
}
return tmp;
}
};
看了大佬的题解, 可以用map
节约时间, 而且建map和查找可以在一次遍历
中完成, 更加节约时间
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> tmp;//存结果
map<int,int> m;
int t=nums.size();
for(int i=0;i<t;++i){//建map和查找可以在一次遍历中完成, 先建map再找也可以pass
if(m.count(target-nums[i])>0){
tmp.push_back(m[target-nums[i]]);
tmp.push_back(i);
}
m[nums[i]]=i;
}
return tmp;
}
};
7.整数反转
题目
给出一个 32 位
的有符号整数
,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
class Solution {
public:
int reverse(int x) {
//此处填写解答
}
};
思路
- 要反转, 想到把它转成字符串再进行操作,
string str = std::to_string(int x);
- 考虑到存在负号不方便直接反转, 所以把负号取出来, 取负号用的是
str.erase()
, 有三种用法
string& erase ( size_t pos = 0, size_t n = npos );
删除从pos开始的n个字符, 包括pos处
iterator erase ( iterator position );
删除position处的一个字符
iterator erase ( iterator first, iterator last );
删除[first, last)之间的字符
- 翻转字符串可以用 algorithm中的
std::reverse(str1.begin(), str1.end() )
, 或者cstring中的strrev(str2)
注意: str1是string对象, str2是char* 即c风格的字符串, 二者不能混用 - 这里因为我用了string所以尝试了一下
std::reverse
, 发现还没我自写的翻转快, 所以就没用
- 翻转之后就需要把字符串转为整数, 用
stoi()
, 这个函数在int溢出时会throw一个out_of_range
的错误, 便于进行try catch处理; 如果用atoi()
, 溢出就会返回上/下界而没有任何提示, 不方便处理 - 最后别忘了再乘上符号位
class Solution {
public:
int reverse(int x) {
string tmp=std::to_string(x);
//保存符号位,删除符号位
int sign=1;
if(tmp[0]=='-'){
sign=-1;
tmp.erase(tmp.begin());
}
//翻转 时间复杂度O(n)
int n=tmp.length();
if(n>10){//超出10位直接返回, 节约时间, 避免翻转操作
return 0;//-2,147,483,648 ~ 2,147,483,647 10位数
}
//自写翻转函数竟然比标准库函数快
//std::reverse(tmp.begin(),tmp.end());
for(int i=0,j=n-1;i<j;i++,j--){
char c=tmp[i];
tmp[i]=tmp[j];
tmp[j]=c;
}
int ans=0;
try{
ans=stoi(tmp);
}catch(out_of_range err){}
return ans*sign;
}
};