算法刷题:LC初级算法
Posted 看,未来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法刷题:LC初级算法相关的知识,希望对你有一定的参考价值。
整数反转
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnx13t/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这,老老实实做不就好了吗?
int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0;
if (rev < INT_MIN/10 || (rev == INT_MIN / 10 && pop < -8)) return 0;
rev = rev * 10 + pop;
}
return rev;
}
字符串中的第一个唯一字符
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
思路:先读取字符串存入哈希表中,再遍历字符串看看哪个字符出现的最早。
int firstUniqChar(string s) {
unordered_map<char,int> umci;
for(char c:s){
umci[c]+=1;
}
for(int i = 0;i<s.size();i++){
if(umci[s[i]] == 1)
return i;
}
return -1;
}
有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
说明:
你可以假设字符串只包含小写字母。
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xn96us/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
思路:用哈希表还是有点麻烦,还是直接vector上吧。
bool isAnagram(string s, string t) {
vector<int> a(26);
for(char c:s)
a[c-97]+=1;
for(char c:t)
a[c-97]-=1;
for(int x:a)
if(x!=0)
return false;
return true;
}
验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xne8id/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
思路很直接,双指针没什么好说的。
回头全部写完会去跟别人的解法对比一下。
bool isPalindrome(string s) {
int sz = s.size();
for(int i = 0;i<sz;i++,sz--){
while(s[i]<48 || (s[i]>58 && s[i]<65) || (s[i]>90 && s[i]<97) || s[i]<122){
i++;
}
while(s[sz]<48 || (s[sz]>58 && s[sz]<65) || (s[sz]>90 && s[sz]<97) || s[sz]<122){
sz--;
}
if(i<sz){
if(s[i]!=s[sz])
return false;
}
}
return true;
}
给定一个正整数 n ,输出外观数列的第 n 项。
「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。
你可以将其视作是由递归公式定义的数字字符串序列:
countAndSay(1) = "1"
countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。
前五项如下:
1. 1
2. 11
3. 21
4. 1211
5. 111221
第一项是数字 1
描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 "11"
描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 "21"
描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 "1211"
描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 "111221"
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnpvdm/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
思路:
从“1”开始往上叠加。
string countAndSay(int n) {
string s = '1'
char flag = s[0];
int count = 0;
string temp;
for(int i = 0;i<s.size();i++){
if(s[i] == flag)
count++;
else{
temp.append(itoa(count))
flag = s[i];
count = 0;
}
}
}
最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnmav1/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
思路:先按照字符串长度进行排序,之后对排过序的字符串取最长公共前缀子串。
static bool compare(const string &a, const string &b){
return a.size()<b.size();
}
string longestCommonPrefix(vector<string>& strs) {
sort(strs.begin(), strs.end(),compare);
if(strs.size()==0 || strs[0].size()==0 ){
return "";
}
for(int i=0;i<strs[0].size();i++){
for(int j=1;j<strs.size();j++){
if(strs[j][i]!=strs[j-1][i]){
return strs[0].substr(0,i);
}
}
}
return strs[0];
}
以上是关于算法刷题:LC初级算法的主要内容,如果未能解决你的问题,请参考以下文章