反转字符串
题目:把vector char反转
AC代码:
class Solution {
public:
void reverseString(vector<char>& s) {
char temp;
int len = s.size();
int bound = len/2;
for(int i = 0;i<bound;i++)
{
temp = s[i];
s[i] = s[len-1-i];
s[len-1-i] = temp;
}
}
};
整数反转
题目:将给定的32位整数取反(321变为123),如果overflow,返回0。
AC代码:
class Solution {
public:
int reverse(int x) {
long temp = x;
int sig = temp>0?1:-1; //符号
int min = 0x80000000,max = 0x7FFFFFFF;
vector<int> v;
temp /= sig; //abs
while(temp!=0)
{
int cur=temp%10;
temp/=10;
v.push_back(cur);
}
long value = 0;
for(int i = 0;i<v.size();i++)
{
value = value * 10 + (v[i]);
}
value *= sig;
if(value<min||value>max)
return 0;
else
return value;
}
};
字符串中的第一个唯一字符
错误代码:
//错误原因:生成的uniq并不是唯一的字符集合,而是所有字符。
class Solution {
public:
int firstUniqChar(string s) {
//找到所有没重复出现的字符,无则返回-1,然后再从左到右扫描,第一次出现set中有的字符,返回下标。
set<char> uniq;
int len = s.size();
string temp(s);
sort(temp.begin(),temp.end());
for(int i = 0;i<len;)
{
uniq.insert(temp[i]);
while(i<len-1&&temp[i]==temp[i+1])
i++;
i++;
}
for(int i = 0;i<len;i++)
{
if(uniq.find(s[i])!=uniq.end())
return i;
}
return -1;
}
};
正确代码:
class Solution {
public:
int firstUniqChar(string s) {
//找到所有没重复出现的字符,无则返回-1,然后再从左到右扫描,第一次出现set中有的字符,返回下标。
set<char> uniq;
int len = s.size();
string temp(s);
sort(temp.begin(),temp.end());
for(int i = 0;i<len;)
{
if(i==len-1||temp[i]!=temp[i+1]) //如果已经是最后一个了,或者是不等于下一个
{ uniq.insert(temp[i]);
i++;}
else
//有重复的
{
while(i<len-1&&temp[i]==temp[i+1])
i++;
i++;
}
}
for(int i = 0;i<len;i++)
{
if(uniq.find(s[i])!=uniq.end())
return i;
}
return -1;
}
};
有效的字母异位词
AC代码:
class Solution {
public:
bool isAnagram(string s, string t) {
int len1 = s.size(),len2 = t.size();
if(len1!=len2) return false;
sort(s.begin(),s.end());
sort(t.begin(),t.end());
for(int i = 0;i<len1;i++)
if(s[i]!=t[i])
return false;
return true;
}
};
验证回文字符串
运行超时了
错误代码:
class Solution {
public:
//忽略大小写(所以最开始全部转换为大写),只考虑数字和字母
bool isPalindrome(string s) {
int p2 = s.size()-1;
int p1 = 0;
if(p2==-1) return true; //空字符串也符合
upper(s);
//move函数将前后指针移到下一个数字或者字母
moveF(s,p1);
moveB(s,p2);
while(p1<p2)
{
if(s[p1]!=s[p2])
return false;
moveF(s,p1);
moveB(s,p2);
}
return true;
}
void upper(string& s)
{
int len = s.size();
for(int i = 0;i<len;i++)
{
//如果是小写字母,转换为upper case
if(s[i]>='a'&&s[i]<='z')
s[i] += ('A'-'a');
}
}
void moveF(string& s,int& p)
{
int len = s.size();
while(p<len) //可以向前移动,且有必要
{
if(s[p]>='A'&&s[p]<='Z')
return;
if((s[p]>='0'&&s[p]<='9'))
return;
p++;
}
//返回可能是找到了,也可能因为到头了
}
void moveB(string& s,int& p)
{
while(p>=0) //可以向前移动,且有必要
{if(s[p]>='A'&&s[p]<='Z')
return;
if((s[p]>='0'&&s[p]<='9'))
return;
p--;
}
}
};
字符串转换整数(atoi)
写的逻辑很麻烦,回头再看能否改善。
AC代码:
class Solution {
public:
int myAtoi(string str) {
int max = 0x7fffffff,min=0x80000000;
int i = 0;
long val = 0,sig=1,start=0;
int len = str.length();
if(len==0) return 0; //字符串空
while(i<len&&str[i]==' ')
i++; //ignore spaces before num
if(i==len) //如果全空,返回0
return 0;
if(!( str[i]=='+' || str[i]=='-' || (str[i]>='0'&&str[i]<='9') ))
return 0;
if(str[i]=='-')
sig = -1;
if(str[i]=='+'||str[i]=='-')
i++;
bool flag = false;
while(i<len&&str[i]>='0'&&str[i]<='9')
{
if(str[i]!='0') flag=true;
if(flag) start++;
if(start>=11)
{
if(sig==1)
return max;
else
return min;
}
val = val*10+(str[i]-'0');
i++;
}
val *= sig;
if(val>max)
val=max;
else if(val<min)
val = min;
return val;
}
};
## 实现strStr()
思路:取长度一样的haystack子串与needle比较,匹配,返回此时子串的起始下标。
AC代码:
class Solution {
public:
int strStr(string haystack, string needle) {
int len1 = haystack.length(),len2=needle.length();
if (len1<len2) return -1;
for(int i =0;i<=len1-len2;i++)
{
if(match(haystack.substr(i,len2),needle))
return i;
}
return -1;
}
bool match(string s1,string s2)
{
int len = s1.length();
for(int i = 0;i<len;i++)
{
if(s1[i]!=s2[i])
return false;
}
return true;
}
};
## 报数
AC代码:
class Solution {
public:
string countAndSay(int n) {
string init="1";
n=n-1;
while(n--)
{
init=count(init);
}
return init;
}
string count(string init)
{
string newStr;
int len = init.size();
int pos = 0;
while(pos<len)
{
int cnt = 1;
char val = init[pos];
pos++;
while(pos<len&&init[pos]==val)
{cnt++;pos++;}
newStr.insert(newStr.end(),cnt+'0');
newStr.insert(newStr.end(),val);
}
return newStr;
}
};
最长公共前缀
AC代码:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
//找到最短的字符串,以它为基准
int minLen = 10000;
string base;
for(int i = 0;i<strs.size();i++)
{
string s = strs[i];
int len = s.length();
if(len<minLen)
{
base = strs[i];
minLen = len;
}
}
cout<<base;
if(minLen==0)
return "";
int p = 0;
int i;
for(i = 0;i<minLen;i++) //慢慢扩大长度
{
int j = 0;
for(;j<strs.size();j++)
{
string s = strs[j];
if(s.substr(0,i+1)!=base.substr(0,i+1))
break; //有一个串没有这个前缀就不行
}
if(j!=strs.size())
break; //判断j这个长度的前缀是否都有
}
if(i==0) return "";
return base.substr(0,i);
}
};