字符串问题收集

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

你可能感兴趣的:(职场,休闲)