面试题,怎么查找一个字符串里的最长连续字符?

zyb365 2007-04-09 09:18:01
Find the longest run in a string
怎么查找一个字符串里的最长连续相同字符?
int longestrun(char* str)
{
// e.g. input ddbbbcxg, return 3 (because bbb has 3 b's in a row)
// e.g. input hello, return 2 (because ll has 2 l's in a row)
}

longestrun("Gooooodbye")); // should output 5
longestrun("Interesting")); // should output 1
...全文
3685 103 打赏 收藏 转发到动态 举报
写回复
用AI写文章
103 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuike 2007-09-04
  • 打赏
  • 举报
回复
int _my_longestcount(const char* str)
{
if (!str)
return 0;

char token(0);
int counter(0), max_n(0);
while (*str)
{
if (token != *str)
{
token = *str;
max_n = max_n>count?max_n:counter;
counter = 1;
}
else
{
counter ++;
}
str++;
}
return max_n;
}
haohuilai 2007-06-15
  • 打赏
  • 举报
回复
mark
asert 2007-06-03
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>

//Find the longest run in a string
//怎么查找一个字符串里的最长连续相同字符?
void find_longestchar(char* str)
{
int longest = 0,count = 0,i = 0,len = strlen(str);
char longest_char = 0,c = 0;
int broken = 0;

for(; i < len; i++) {
if(longest_char == 0) {
longest_char = str[i];
longest = 1;
continue;
}

if(longest_char == str[i] && !broken) {
longest++;
continue;
} else if(c == 0 || c != str[i]){
c = str[i];
count = 1;
} else if(str[i] == c){
count++;
}

broken = 1;
if(count >= longest) {
longest = count;
longest_char = c;
broken = 0;
}
}

printf("longest char is %c,total count is %d\n",longest_char,longest);
}


int main(){
find_longestchar("Gooooodbye"); // should output 5
find_longestchar("Interesting"); // should output 1
return 0;
}
zyb365 2007-04-20
  • 打赏
  • 举报
回复
To zyin3526()
I like your style.
zyin3526 2007-04-19
  • 打赏
  • 举报
回复
第一次回帖就得分,谢谢肯定

在这里给大家两点建议(不对的地方,不要拍我啊:)):
1、写代码时,不要舍不得用括号,完备的括号不会影响程序性能,却能让你的程序可读性大大提高,而且逻辑性更强,举个例子:c = a+++b;在不同的系统和编译器下,结果是不一样的;
2、标识符的命名要有特定的含义,形成自己的风格,不要到处都是a,b,c,..或i,j,k,..这样的名字。这样的代码看起来很费劲。
zyb365 2007-04-18
  • 打赏
  • 举报
回复
kingcxd(恶魔之左手)
你的代码我欣赏了,写的也不错,可惜没有分。
Piao_Polar 2007-04-17
  • 打赏
  • 举报
回复
To:
toxyboy(不专业,我就顶,绝不误导别人!!)

你同事写错了,或者你没看懂题目~

对比之前你的评论,有点讽刺,夫子自道……
hzhxxx 2007-04-16
  • 打赏
  • 举报
回复

int MaxLengthRepeatString(const char *src)
{
assert(src);
int length = strlen(src);
int len = length / 2 ;
int count = 0;
char * target = 0;
for(;len > 0;len--)
{
for(int i = 0;i + len <= length;++i)
{
int k = 0;
for(k = 0;k + len <= i;k++)
{
int j = 0;
bool find = true;
for(j = 0;j < len ;++j)
{
if(src[i + j] != src[k + j])
{
find = false;
break;
}
}

if(find)
{
if(target == 0)
{
target = new char[len + 1];
strncpy(target,src + i,len);
target[len] = '\0';
printf("forward target is :%s,position is :%d,next position is: %d\n",target,i,k);
delete []target;
target = 0;
}
count++;
}
}

for(k = i + 1;k + len <= length;k++)
{
int j = 0;
bool find = true;
for(j = 0;j < len;++j)
{
if(src[i + j] != src[k + j])
{
find = false;
break;
}
}

if(find)
{
if(target == 0)
{
target = new char[len + 1];
strncpy(target,src + i,len);
target[len] = '\0';
printf("follow target is :%s,position is :%d,next position is: %d\n",target,i,k);
delete []target;
target = 0;
}
count++;
}
}

if(count > 0)
{
break;
}
}

if(count > 0)
{
//printf("repeat string is : %s, length is :%d\n",strncpy(),len);
printf("repeat string length is :%d\n",len);
break;
}
}

return count;
}

谨以此帖纪念2007 年4 月份面试该题目失败!
kingcxd 2007-04-16
  • 打赏
  • 举报
回复
没人欣赏俺的代码
zyin3526 2007-04-15
  • 打赏
  • 举报
回复
程序好坏不能光看长短,效率和可读性是关键:

#include <stdio.h>

int longestrun(char* Str)
{
unsigned int uiMaxLen = 1;
unsigned int uiCurLen = 1;
if (Str)
{
char *pStr = Str + 1;
while (*pStr)
{
if (*(pStr - 1) == *pStr)
{
++uiCurLen;
}
else
{
uiMaxLen = (uiCurLen > uiMaxLen) ? uiCurLen : uiMaxLen;
uiCurLen = 1;
}
++pStr;
}
return (uiMaxLen > uiCurLen) ? uiMaxLen : uiCurLen;
}
return 0;
}
//测试程序,字符串长度不能超过1023
void main()
{
char pchStr[1024] = {'\0'};
while (1)
{
scanf("%s",pchStr);
printf("%d\n", longestrun(pchStr));
}
}
zyb365 2007-04-14
  • 打赏
  • 举报
回复
最近一直在外奔波,今天来了一看没想到这么多帖子了 ,大家的积极性都很高。一直想结贴,大家写的都很好,就是拿不准该把分给谁了。大家评比一下,明晚结贴。
toxyboy 2007-04-13
  • 打赏
  • 举报
回复
int _tmain(int argc, _TCHAR* argv[])
{
string strtest="sssssssssssssdffffffsss";
cout << "the src string is:" << strtest << endl;
cout << "max char is:";
cout << getlength((char*)strtest.c_str()) << endl;
//cout << longestrun((char*)strtest.c_str()) << endl;
return 0;
}
附上代码各位可以测试一下,测试了4个,三个是错误结果,一个还越界。。。
toxyboy 2007-04-13
  • 打赏
  • 举报
回复
随机测试了一下,没看到一个对的。。
自己写的也不测试一下,不知道你们工作中是不是都是让项目经理给你们擦屁股的?
hzhxxx 2007-04-13
  • 打赏
  • 举报
回复

....
cheloe 2007-04-13
  • 打赏
  • 举报
回复
/*俺的,用了两个循环~,权当参考吧*/
#include <stdio.h>
#define SIZE 100
int longestrun(char *str)
{
int count,max=0;
while(*str!='\0'){
count=1;
while(*(str+1)==*str){
count++; str++;
}
if(max<count) max=count;
str++;
}
return max;
}
main()
{
char str[SIZE];
int count=0;
printf("请输入一个字符串:");
scanf("%s",str);
printf("%d\n",longestrun(str));
getch();
}
royt 2007-04-13
  • 打赏
  • 举报
回复
我的答案,尽量精简的情况:

int longestrun(char* str)
{
int cnt=1, max=0;
for (char *p=str; *p; ++p)
max = (cnt = *(p+1) && *p==*(p+1) ? ++cnt : 1) > max ? cnt : max;
return max;
}

/**************************************************************

以上的函数将参数str为空串的情况考虑进去,即str[0]=='\0'时函数应该返回0,虽然这样代码行较为简单,但在实际应用中,建议将参数为空串的情况单独考虑,代码更加整洁,运算效率也较高,如下:

int longestrun(char* str)
{
if (! *str)
return 0;
int cnt=1, max=1;
for (char *p=str; *(p+1); ++p)
max = (cnt = *p==*(p+1) ? ++cnt : 1) > max ? cnt : max;
return max;
}

在gcc 3.4.2下调试通过,主函数代码如下:

int main(void)
{
char a[] = "hello";
char b[] = "gooooodbye";
char c[] = "iiiiloveuuuu";
char d[] = "Interesting";
char e[] = "!";
char f[] = "";
char g[] = "aaabbbcccaaaaabbbbbccccccabc";
printf("%d\n", longestrun(a));
printf("%d\n", longestrun(b));
printf("%d\n", longestrun(c));
printf("%d\n", longestrun(d));
printf("%d\n", longestrun(e));
printf("%d\n", longestrun(f));
printf("%d\n", longestrun(g));
return 0;
}

输出:
2
5
4
1
1
0
6

***********************************/
songiam 2007-04-13
  • 打赏
  • 举报
回复
toxyboy(不专业,我就顶,绝不误导别人!!) :

输入:fffsssffffdddffffsssffffffffsssssssdffffffsss
输出:8
结果正确。下面是完整的程序:
请测试。

#include <stdio.h>

int longestrun(char *str)
{

int charNumTemp = 1;
int charNumMax = 1;//最长连续字符的个数
char charRun;

if (0 == str)//如果字符串为空,则返回0
{
return 0;
}

charRun = *str;

while (*str)
{
++str;//取下一个字符
if (charRun == *str)
++charNumTemp;
else
charNumTemp = 1;

charRun = *str;

if (charNumTemp > charNumMax)
charNumMax = charNumTemp;

}

return charNumMax;
}


void main()
{
while (1)
{
char myStr[1000];
char *str = myStr;
scanf("%s", str);
printf("%d\n", longestrun(str));
}
}
nickzou 2007-04-13
  • 打赏
  • 举报
回复
int longestrun(const char* str)
{
char old = str[0];
int cnt = 0, max = 0;

while (*str != '\0')
{
if (*str == old)
{
cnt++;
}
else
{
max = (cnt > max) ? cnt : max;
old = *str;
cnt = 1;
}
str++;
}
max = (cnt > max) ? cnt : max;

return max;
}
kingcxd 2007-04-13
  • 打赏
  • 举报
回复
s[i]!=0
应该是
s[i] != '\0'吧
kingcxd 2007-04-13
  • 打赏
  • 举报
回复
toxyboy(不专业,我就顶,绝不误导别人!!)
你测我的
加载更多回复(83)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧