题目:最长数字字符串
给定一个字符串,输出字符串中最长的数字串,并把这个数字串的长度输出。
请一个在字符串中找出连续最长的数字串,并把这个串的长度返回;如果存在长度相同的连续数字串,返回最后一个连续数字串;
注意:数字串只需要是数字组成的就可以,并不要求顺序,比如数字串“1234”的长度就小于数字串“1359055”,如果没有数字,则返回空字符串(“”)而不是NULL!
输入描述:
一个字符串
输出描述:
输出最长的数字串,输出最长数字串个数;
中间以逗号(,)隔开;
示例1
输入
abcd12345ed125ss123058789
输出
123058789,9
思路
字符串是给定的,先用最粗暴的暴力匹配吧;
难点是前后数字串的比较;
看起来挺简单的,实现起来还是很难抓住点
代码
(错误示范)
#include "stdio.h"
#include "string.h"
void find_longest_num_str(char *s)
{
char *p,*num_str,*temp;
int len,i,count = 0,num_flag = 0,max_count=0;
p = s;
len = strlen(s);
printf("strlen : %d\n",len);
for(i=0;i<len;i++)
{
//遍历字符串,遇到数字开启内层循环,直到数字结束,保留长度与首地址
if((*(p+i) >= '0')&&(*(p+i)<='9'))
{
printf("find number\n");
num_flag = 1;
while(num_flag)
{
if((*(p+i) >= '0')&&(*(p+i)<='9'))
{
printf("find number1\n");
count++;
i++;
}else
{
if(count >= max_count)
{
max_count = count;
num_str = p+i-count;
*(num_str+count+1) = '\0'; //这样做会导致字符串的改变,要小心使用指针
}
count = 0;
num_flag = 0;
}
}
}
}
printf("the longest num_str is %s, count %d\n",num_str,max_count);
}
int main()
{
char *str;
str = "abc123eb3456322cdd2";
find_longest_num_str(str);
return 0;
}
(错误示范2)
#include "stdio.h"
#include "string.h"
void find_longest_num_str(char *p)
{
char *num_str,temp[50];
int len,i,j=0,count = 0,num_flag = 0,max_count=0;
len = strlen(p);
printf("strlen : %d\n",len);
for(i=0;i<len;i++)
{
//遍历字符串,遇到数字开启内层循环,直到数字结束,保留长度与首地址
if((*(p+i) >= '0')&&(*(p+i)<='9'))
{
num_flag = 1;
while(num_flag)
{
if((*(p+i) >= '0')&&(*(p+i)<='9'))
{
temp[j]=*(p+i);
count++;
i++;
j++;
}else
{
if(count >= max_count)
{
max_count = count;
num_str = temp;
}
count = 0;
num_flag = 0;
}
}
}
}
printf("the longest num_str is %s, count %d\n",num_str,max_count);
}
int main()
{
char *str;
str = "abc123eb3456322cdd2";
find_longest_num_str(str);
return 0;
}
上面的问题是,没有清空缓存,打印了所有的数字字符
错误代码3
#include "stdio.h"
#include "string.h"
void find_longest_num_str(char *p)
{
char *num_str,temp[50];
int len,i,j=0,count = 0,num_flag = 0,max_count=0;
len = strlen(p);
printf("strlen : %d\n",len);
for(i=0;i<len;i++)
{
//遍历字符串,遇到数字开启内层循环,直到数字结束,保留长度与首地址
if((*(p+i) >= '0')&&(*(p+i)<='9'))
{
num_flag = 1;
while(num_flag)
{
if((*(p+i) >= '0')&&(*(p+i)<='9'))
{
temp[j]=*(p+i);
count++;
i++;
j++;
}else
{
if(count >= max_count)
{
max_count = count;
num_str = temp;
j=0;
}
count = 0;
num_flag = 0;
}
}
}
}
printf("the longest num_str is %s, count %d\n",num_str,max_count);
}
int main()
{
char *str;
str = "abc123eb34563227777cdd288888888888888888888";
find_longest_num_str(str);
return 0;
}
感觉像缓冲区没有清干净
总结
指针的使用要小心
内层循环和更新条件要小心
编程能力还是太弱了