1 整数与字符串的转换
将整数转成字符串,思路之一:先计算出整数总共位数,并将字符串指针移到最后.
然后进行取余运算,每取一次将得到的字符放入字符串,指针前移.
需要注意的是:一开始要判断负数,并置'-'。
char *conv(int in, char *out)
{
char *ret = out;
int len = 0;
int tmp;
if (in < 0)
{
*out++ = '-';
in = -in;
}
tmp = in;
while(tmp>0) { out++;tmp = tmp/10;}
*out = '\0';
out--;
do
{
*out--= '0' +in%10;
in = in/10;
}
while(in>0);
return ret;
}
-----------------------
另一种方法: 先转成字符串,然后将字符串整个倒序。
char *conv(int num, char *str){
int i = 0,j = 0, isneg = 0;
char tmp[10];
if(num < 0) {
isneg = 1;
num *= -1;
}
do{
tmp [i++] = (num % 10) + '0';
num /= 10;
} while (num);
if(isneg) tmp[i++] = '-';
while ( i> 0)
str[j++] = tmp[--i];
str[j] = '\0';
return str;
}
---------------------
递归方法
char* rcsv_str_from_i(int i_in,char* str_out)
{
//static unsigned count=0;
// in case it is a minor integer for the first time
if (i_in<0)
{
i_in*=(-1);
*str_out++='-';
}
if(i_in/10) // not the most important bit in decimal, then recursively calling itself
{
str_out = rcsv_str_from_i(i_in/10,str_out);
*str_out++=i_in%10+'0';
*str_out = '\0'; // in case this is the last step
}
else // the most important bit
{
*str_out++=i_in+'0';
*str_out = '\0'; // in case this is the last step
}
// return the address for the next valid char
return str_out;
}
---------------------------------
字符串转换成整数
int con_ctoi(char str[])
{
int ret = 0;
int isneg = 0;
int i = 0;
if(str[0] == '\0')
{
isneg = 1;
i++;
}
while(str[i] != '\0')
{
ret *= 10;
ret += (str[i++] -'0');
}
if (isneg) ret *= -1;
return ret;
}
2 字符串逆转
void reverse(char str[]){
char tmp;
int start = 0;
int end = 0;
int i = 0;
while(str[i++] != '\0') end++;
end--;
while(end>start)
{
tmp = str[start];
str[start] = str[end];
str[end] = tmp;
start++;
end--;
}
}
考虑用指针实现
char* strrev2(const char* str)
{
char* tmp = new char[strlen(str) + 1];
strcpy(tmp,str);
char* ret = tmp;
char* p = tmp + strlen(str) - 1;
while (p > tmp)
{
char t = *tmp;
*tmp = *p;
*p = t;
--p;
++tmp;
}
return ret;
}
考虑做一些优化:主要在交换的地方做了。
while (p > tmp)
{
*p ^= *tmp;
*tmp ^= *p;
*p ^= *tmp;
--p;
++tmp;
}
while(p >tmp)
{
*p = *p + *tmp;
*tmp = *p - *tmp;
*p = *p - *tmp;
--p;
++tmp;
}
--------------------------------------------
一个利用递归实现输出逆转字符串的方法,很简洁
void rev_out(char *str)
{
if(*str != '\0')
{
rev_out(++str)
putchar(*(str-1));
}
}
另外的思想解决这个问题:每次交换首尾两个字符,中间部分则又变为和原来字符串同样的问题,因此可以通过递归的思想来解决这个问题,对应的实现代码为:
char* strrev5(/*const */char* str,int len)
{
if (len <= 1)
return str;
char t = *str;
*str = *(str + len -1);
*(str + len -1) = t;
return (strrev5(str + 1,len - 2) - 1);
}
|
3 在字符串中查找第一个无重复字符如:
total -> o; teeter -> r
首先,不可能用通常的方法去遍历每一个与前面(或后面)所有的字符进行比较, 这样将是
O(n2 )的。为达到O(n)级别,考虑哈希表和数组的查找。当查找字符串很长但字符集有限的话,则可选用数组; 如果查找的字符集很大,比如unicode ,那么显然必须用哈希表了。
char nosame(char str[])
{
int mode[256] = {0};
int i = 0;
char *p = str;
int len = strlen(str);
for( i = 0; i < len; i++)
{
mode[str[i]]++;
}
for(i = 0; i< len; i++)
{ if (mode[str[i]] == 1 )
break;
}
if ( i == len)
return 0;
return str[i];
}
如果这个问题要求解最后一个没重复的字符,则只需要在最后
for(i = len; i>=0; i--)
{ if (mode[str[i]] == 1 )
break;
}
类似的问题还有: 要查找字符串中重复出现的最长的连续字符,如: adkoweeefkffff -> f
4查找最长子串 ,给定一个字符串,要求找出重复出现且最长的子串.如ababc -> ab
转自 http://hi.baidu.com/denmouse/blog/item/afeae9249aa272368644f936.html