C++中string.length()返回类型是size_t,可以简单地认为是unsigned int 类型,即无符号类型,如果不经过转换就拿它和有符号类型进行比较,很容易发生错误。例如无符号整型i的值为0,当它减一的时候由于编码问题会变得很大,这样在比较的时候就会发生问题。
例:
string s = "123";
int j = -1;
if( j < s.length() )
{
cout << "j<s.length" << endl;
}
这里编译器会对j或者s.length()的返回值做强制类型转换,编译器会把有符号数转换为无符号数,相当于
string s = "123";
int j = -1;
if( (size_t)j < s.length() )
{
cout << "j<s.length" << endl;
}
那么,当j=-1时,j被自动转换为无符号数.
解决这个问题的最简单办法,就是显示地将无符号数转换为有符号数:
string s = "123";
int j = -1;
if( j < (int)s.length() )
{
cout << "j<s.length" << endl;
}
例:字符串压缩:利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
string compressString(string s) {
if ((int)s.length() == 0) return s;
string ans = "";
char ch = s[0];
int cnt = 1;
for (int i = 1; i < (int)s.length(); i++) {
if (ch == s[i]) cnt++;
else {
ans += ch + to_string(cnt);
ch = s[i];
cnt = 1;
}
}
ans += ch + to_string(cnt);
return ans.length() <= s.length() ? ans : s;
}
注:Java版本解法:
public string compressString(string s){
if(s.length()==0) return s;
StringBuffer ans=new StringBuffer();
char ch=s.charAt(0);
int cnt=1;
for(int i=1;i<s.length();i++){
if (ch == s.charAt(i)) cnt++;
else {
ans,append(ch);
ans.append(cnt);
ch = s.charAt(i);
cnt = 1;
}
}
ans,append(ch);
ans.append(cnt);
return ans.length() <= s.length() ? ans.toString() : s;
}
def compressString(self,s:str)->str:
if not s:
return ""
ans = ""
ch = s[0]
cnt = 0
for c in s
if ch==c:
cnt += 1
else:
ans += ch + str(cnt)
ch = c
cnt = 1
ans += ch + str(cnt)
return ans if len(ans)<=len(s) else s
注:Python的类型——
int,long,float: 整型,长整形,浮点型
bool,str: 布尔型,字符串类型
List, Tuple, Dict, Set:列表,元组,字典, 集合
Iterable,Iterator:可迭代类型,迭代器类型
Generator:生成器类型