华为机试题—在字符串中找出连续最长的数字串 c++

/*
题目:在字符串中找出连续最长的数字串,并把这个串的长度返回

函数原型:
   unsignedint Continumax(char** pOutputstr,  char* intputstr)

输入参数:
   char* intputstr  输入字符串;

输出参数:
   char** pOutputstr: 连续最长的数字串,如果连续最长的数字串的长度为0,
   应该返回空字符串;如果输入字符串是空,也应该返回空字符串;  

返回值:
  连续最长的数字串的长度

输出格式:
1.如果输入空串,则只输出空串;
2.如果字符串中只有字母,数字个数为0,则只输出0;
3.如果输入字串中有多个相同长度的数字字串,那么依次输出这些字串,
用逗号隔开,在最后输出这些字串的长度,如输入132ab123 那么 输出 132,123,3
解决思路:
逐个字符遍历,当遇到数字时,计算连续数字的个数并保存数字子串,
如果个数大于之前出现的数字子串,则保存新的数字子串

难点:二级指针作形参
一级指针地址赋给二级指针。二级指针元素遍历用:  *(*pOutputstr+i)
*/
法一:运用指针运算,减少变量的定义
unsigned int Continumax(char** pOutputstr,  char* inputstr)
 {

    char* temp=NULL;
    char* last=NULL;
    int max=0;
    *pOutputstr=(char*)malloc(sizeof(char)*30);
    if(inputstr==NULL||* inputstr==0)
        { 
          **pOutputstr='\0';
          return 0;
        }
    while(*inputstr!='\0')
    {
        if(*inputstr>='0'&&*inputstr<='9')
        {
            temp=inputstr;
            while(*inputstr>='0'&&*inputstr<='9')
            {inputstr++;}
            if(max<=(inputstr-temp))
                {
                    max=(inputstr-temp);
                    last=temp;
                }
            //if(max!=0)
            inputstr--;
        }
        inputstr++;
    }
    if(max==0)
    {
        **pOutputstr='\0';
        return 0;
    }

    int i;
    for ( i = 0; i < max; ++i)
    {
         *(*pOutputstr+i)=*(last+i);  
    }
    *(*pOutputstr+i)='\0';
    return max;

}
int main()
{
   char input[100];
   cin.getline(input,100);
   char *out=NULL;
   int n;//最大长度
   n=Continumax(&out,input);
   if(input[0]=='\0')
        cout<<input[0]<<endl;
   else if(n==0)
        cout<<n<<endl;
   if(n!=0)
   {
     cout<<out<<","<<n<<endl;

   }
   free(out); 
}

法二:此方法有内存泄露问题,在调用函数中释放指针结果会有错。不释放就会产生泄露。还未解决。
unsigned int Continumax(char** pOutputstr,  char* inputstr)
 {
    *pOutputstr=(char*)malloc(sizeof(char)*30);
    if(inputstr==NULL)
        { 
        **pOutputstr='\0';
          return 0;
    }
    int i=0,j=0;
    int len=0;//每个数字串的长度
    char *p=NULL;
    char *temp=NULL;
    temp=(char*)malloc(sizeof(char)*30);
    while(inputstr[i]!='\0')
    {
        if(inputstr[i]>='0'&&inputstr[i]<='9')
        {
            p=inputstr+i;
            for(j=i;;j++)
                if(inputstr[j]<'0'||inputstr[j]>'9')
                {
                    p[j-i]='\0';
                    if(len<=j-i)
                    {
                        len=j-i;
                        strcpy(temp,p); 
                    }
                    break;
                    if(inputstr[j]=='\0')
                    {
                        *pOutputstr=temp;
                        return len;
                    }
                }
            i=j;
        }
        i++;

    }
    if(len==0)
        {
            *pOutputstr=(char*)malloc(sizeof(char)*30);
            **pOutputstr='\0';
            return 0;
         }

    *pOutputstr=temp;
    return len;

 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值