1.1 对字符串的字符作统计
作统计,需要辅助空间,越省越好。判断有没有重复的字符(每种字符用1bit即可),也可以判断出现次数最多的字符(每种字符用一个unsigned int)。
下面是统计是否有重复字符。
int isUniqueChar(String str)
{
int checker = 0; //32位int型足够存下26个字符
for(int i=0;i<str.length();i++)
{
int idx = str[i] - 'a';//字符转换为序号
if( (checker & (1<<idx)) > 0) //重复出现
return false;
else
checker |= (1<<idx); //标记为出现
}
return true;
}
1.2 字符串逆置
# include<cstdio>
# include<iostream>
void main()
{
char a[] = "abcdefg";
printf("%s\n",a);
char *str = a;
char *end = str;
if(str)
{
while(*end)
end++;
end--;
while(end > str)
{
*end = *end ^ *str;
*str = *end ^ *str;
*end = *end ^ *str;
end--;//交换完之后指针往中间移动
str++;
}
}
printf("%s\n",a);
}
1.3 去除字符串中的重复字符
新字符串和老字符串其实是同一个空间,只是指针位置不同(老串的尾指针扫描的快,新串的尾指针右移的比较慢)
void remvoeDuplicateChar(char *str){
if(str == NULL)
return;
int len = str.length();
if(len<2)
return;
bool[] hit = new bool[256];//可记录256种字符
for(int i=0;i<len;i++)
hit[i] = 0;
hit[str[0]] = 1;
int tail = 1; //字符串的新结尾
for(int i = 1; i<len; i++)
{
if(!hit[str[i]]){ //如果是没有出现过的字符,则追加进来,并标记1
str[tail] = str[i];
tail++;
hit[str[i]] = 1;
}
}
str[tail] = '\0';//终结新串
}
1.5 替换空格
参见 http://blog.csdn.net/luckyjoy521/article/details/9311557
1.7 矩阵中,有一个元素为0,则将该行和该列的元素都置为0
如果只遍历一次,遇到0就把该行该列置0,那么肯定就把整个矩阵变成0了。所以必须要遍历两次。
void setZeros(int[][] matrix)
{
int[] row = new int[matrix.length];
int[] column = new int[matrix[0].length];
//先全部统计好
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[0];j++)
{
if(matrix[i][j]==0){
row[i]=1;
column[j]=1;
}
}
}
//再做处理
for(int i=0;i<matrix.length;i++)
for(int j=0;j<matrix[0].length;j++){
if(row[i]==1 || column[j]==1)
matrix[i][j]=0;
}
}
1.8 用isSubstring()函数来判断两个字符串是不是可以循环移动转换的。
**特性:一个字符串A进行若干次循环移动变为B,如abcde变成cdeab。那么B一定是AA的子串。abcdeabcde。
反过来,对于一个字符串A,如果另一个字符串B是AA的子串,并且A和B的长度相同,那么A进行若干次循环移动可以变为B。
int isRotation(String s1, String s2)
{
int len1 = s1.length();
int len2 = s2.length();
if(len1 != len2)
return 0;
String tmp = s1 + s1;
if(isSubstring(tmp, s2))
return 1;
else
return 0;
}