题目一:长按键入(难度:简单)
思路:首先把字符不相同或者typed字符串长度小于名字的直接返回false。其他情况通过双指针,分别遍历两个字符串,看typed中重复的字符数是否大于或等于name中重复相同的字符数;若不是则返回false。最后再看name的指针是否全部遍历了字符串;如果没有,说明typed中缺少了字符。
class Solution {
public:
bool isLongPressedName(string name, string typed) {
int j=0,indexA=0,indexB=0;
for(int i=0;i<typed.length();){
if(typed[i]!=name[j]||typed.length()<name.length())
return false;
while(typed[i]==name[j]){
i++;indexA++;
}
while(name[j]==typed[i-1]){
j++;indexB++;
}
if(indexA<indexB)return false;
else {
indexA=0;indexB=0;
}
}
if(j<name.length())return false;
return true;
}
};
题目二:赎金信(难度:简单)
思路:两次循环分别遍历ransomNote和magazine,逐个字符对比。如果在magazine中有该字符计数自加1,并将magazine中该字符的值改为'0',如果没有直接返回false。循环结束后,查看index的值是否是ransomNote的长度,如果是返回true,否则为false。
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int index=0,j;
for(int i=0;i<ransomNote.length();i++){
for(j=0;j<magazine.length();j++){
if(magazine[j]==ransomNote[i]){
index++;
magazine[j]='0';
break;
}
}
if(j==magazine.length()) return false;
}
if(index==ransomNote.length()) return true;
return false;
}
};
题目三:猜数字大小(难度:简单)
思路:直接通过二分查找就可解决
class Solution {
public:
int guessNumber(int n) {
long long int low=0,high=n;
while(low<=high){
long long int mid=(high+low)/2;
if(guess(mid)==0) return mid;
else if(guess(mid)==1) low=mid+1;
else if(guess(mid)==-1) high=mid-1;
}
return 0;
}
};
题目四:适合打劫银行的日子(难度:中等)
思路:先判断security容器中的长度是否有time的2倍加1,如果没有直接返回空容器n。然后去循环security容器判断内部元素是否全部相同,如果全部相同就可直接通过time的值直接返回相应的下标。否则,通过双重循环去遍历security容器,把符合条件的元素的下标存入n容器中。最后返回容器n即可。
class Solution {
public:
vector<int> goodDaysToRobBank(vector<int>& security, int time) {
vector<int> n;int j,flag=0;
if(size(security)<time*2+1) return n;
for(int i=0;i<size(security)-1;i++){
if(security[i]!=security[i+1]){
flag=1;break;
}
}
if(flag==1)
for(int i=time;i<size(security)-time;i++){
for(j=i-time;j<i;j++){
if(security[j+1]>security[j]) break;
}
if(j==i)
for(;j<i+time;j++){
if(security[j]>security[j+1]) break;
}
if(j==i+time) n.push_back(i);
}
else {
for(int i=time;i<size(security)-time;i++){
n.push_back(i);
}
}
return n;
}
};
题目五:最大单词长度乘积(难度:中等)
思路:遍历words字符串容器中的每一对字符串,通过位运算来判断两个单词是否有公共字符,将其存入n容器中。之后通过双重循环判断”n[i]&n[j]“是否等于0来看是否有公共字符。如果没有,判断这一对字符串的长度是否大于max来更新max。
class Solution {
public:
int maxProduct(vector<string>& words) {
int length=size(words),max=0;
vector<int> n(length);
for(int i=0;i<length;i++){
string word=words[i];
for(int j=0;j<size(word);j++){
n[i]=n[i]|1<<(word[j]-'a');
}
}
for(int i=0;i<length;i++){
for(int j=i+1;j<length;j++){
if((n[i]&n[j])==0){
if(max<(size(words[i])*size(words[j])))
max=size(words[i])*size(words[j]);
}
}
}
return max;
}
};