LeetCode
整数反转
说明
- 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
- 示例
- 示例 1:
- 输入: 123
- 输出: 321
- 示例 2:
- 输入: -123
- 输出: -321
- 示例 3:
- 输入: 120
- 输出: 21
- 示例 1:
- 注意:
- 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
解答
- 思路:
- 循环预制为 !=0
- res 的上下线要大于int才行(long)
- res 每次乘上 10 + x%10;
- 判断上下线
- Code
class Solution { public: int reverse(int x) { long res=0; while(x) { res=res*10+x%10; x/=10; } if(res>INT_MAX||res<INT_MIN) {return 0;} return res; } };
字符串中的第一个唯一字符
说明
- 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
- 案例:
- s = “leetcode”
- 返回 0.
- s = “loveleetcode”,
- 返回 2.
- 注意事项:您可以假定该字符串只包含小写字母。
解
- 思路:
- 将字符统计到unordered_map内
- 然后循序访问第一个只存在一次的字符
- Code
class Solution { public: int firstUniqChar(string s) { unordered_map<char, int> m; for(auto &a:s) {m[a]++;} int idx = 0; for(; idx < s.size(); ++idx){ if (m[s[idx]] == 1) return idx; } return -1; } };
有效的字母异位词
说明
- 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
- 示例
- 示例 1:
- 输入: s = “anagram”, t = “nagaram”
- 输出: true
- 示例 2:
- 输入: s = “rat”, t = “car”
- 输出: false
- 示例 1:
- 说明:
- 你可以假设字符串只包含小写字母。
- 进阶:
- 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
解答
- 思路:
- 新建一个map对原来的字符串进行统计
- 一个字符串++, 另一个字符串–
- 如果map中所有的key的值都是0,则为true
class Solution { public: bool isAnagram(string s, string t) { if(s.size()!=t.size()){return false;} unordered_map<char, int> m; for(auto &a:s){m[a]++;} for(auto &a:t){m[a]--;} for(auto t:m){ if (t.second != 0){ return false; } } return true; } };
验证回文字符串
说明
- 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
- 说明:本题中,我们将空字符串定义为有效的回文串。
- 示例
- 示例 1:
- 输入: “A man, a plan, a canal: Panama”
- 输出: true
- 示例 2:
- 输入: “race a car”
- 输出: false
- 示例 1:
答案
- 思路
- 左右指针法
- 不在给定区间的字符跳过
- 如果左右指针的字符不等,则非回文字符串
class Solution { public: bool isPalindrome(string s) { transform(s.begin(),s.end(),s.begin(),::tolower); int l =0, r=s.size()-1; while(l < r){ if(!(('a' <= s[l] && s[l] <= 'z') || ('0' <= s[l] && s[l] <= '9'))) {l++; continue;} if(!(('a' <= s[r] && s[r] <= 'z') || ('0' <= s[r] && s[r] <= '9'))) {r--; continue;} if(s[l]!=s[r]){ return false; } ++l, --r; } return true; } };
请你来实现一个 atoi 函数,使其能将字符串转换成整数。
说明
- 功能说明:
- 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
- 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
- 该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
- 注意:
- 假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
- 在任何情况下,若函数不能进行有效的转换时,请返回 0。
- 说明:
- 假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
- 示例
- 示例 1:
- 输入: “42”
- 输出: 42
- 示例 2:
- 输入: " -42"
- 输出: -42
- 解释: 第一个非空白字符为 ‘-’, 它是一个负号。我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
- 示例 3:
- 输入: “4193 with words”
- 输出: 4193
- 解释: 转换截止于数字 ‘3’ ,因为它的下一个字符不为数字。
- 示例 4:
- 输入: “words and 987”
- 输出: 0
- 解释: 第一个非空字符是 ‘w’, 但它不是数字或正、负号。因此无法执行有效的转换。
- 示例 5:
- 输入: “-91283472332”
- 输出: -2147483648
- 解释: 数字 “-91283472332” 超过 32 位有符号整数范围。 因此返回 INT_MIN (−231) 。
- 示例 1:
解答
- 思路
- 抛弃开始的空格
- 获取符号
- 循环
- 尽可能的获取数字
- 如果获取数字失败,则停止循环
- 注意数字上下限问题
- 返回结果,注意上下限
- Code
class Solution { public: int myAtoi(string str) { int l = 0, len=str.size(); // 丢弃开始的Block for(auto &a:str){ if(a==' ') {++l; continue;} break; } // 获取符号 int Flag = 1; if(str[l]=='-'){ ++l; Flag = -1; }else if(str[l]=='+'){ ++l; Flag = 1; } // 转换 long int res = 0; for(;l<len; ++l){ if(str[l]<'0' || str[l]>'9') { break;} res = res*10 + (str[l]-'0'); if(Flag * res > INT_MAX) {return INT_MAX;} if(Flag * res < INT_MIN) {return INT_MIN;} } if(Flag * res > INT_MAX) {return INT_MAX;} if(Flag * res < INT_MIN) {return INT_MIN;} return Flag * res; } };
报数
- 报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
-
1
-
11
-
21
-
1211
-
111221
- 1 被读作 “one 1” (“一个一”) , 即 11。
- 11 被读作 “two 1s” (“两个一”), 即 21。
- 21 被读作 “one 2”, “one 1” (“一个二” , “一个一”) , 即 1211。
- 给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。
- 注意:整数顺序将表示为一个字符串。
- 示例
- 示例 1:
- 输入: 1
- 输出: “1”
- 示例 2:
- 输入: 4
- 输出: “1211”
- 示例 1:
解答
- 思路
- 使用快慢指针来统计出现的数字
- Code
class Solution { public: string countAndSay(int n) { if(n==1){return "1";} string Last = countAndSay(n-1); string Res=""; int l=0, sl=0, len=Last.size(); for(; l<len;l++){ if(Last[l]!=Last[sl]){ // 21 Res += to_string(l-sl); Res += to_string(Last[sl]-'0'); sl = l; } } Res += to_string(l-sl); Res += to_string(Last[sl]-'0'); return Res; } };
最长公共前缀
说明
- 编写一个函数来查找字符串数组中的最长公共前缀。
- 如果不存在公共前缀,返回空字符串 “”。
- 示例
- 示例 1:
- 输入: [“flower”,“flow”,“flight”]
- 输出: “fl”
- 示例 2:
- 输入: [“dog”,“racecar”,“car”]
- 输出: “”
- 解释: 输入不存在公共前缀。
- 示例 1:
- 说明:
- 所有输入只包含小写字母 a-z
解答
- 思路:
- 边界条件为:
- 某一个字串到尾了
- 发现一个字串不等
- 边界条件为:
- Code
class Solution { public: string longestCommonPrefix(vector<string>& strs) { if(strs.size()==0) {return "";} for(int idx = 0; idx < strs[0].size(); ++idx){ char c = strs[0][idx]; for(int strIdx=1; strIdx < strs.size(); ++strIdx){ if((strs[strIdx].size()==idx) || strs[strIdx][idx]!=c){ return strs[0].substr(0,idx); } } } return strs[0]; } };