一个关于C++字符串操作的算法

北京迅哥 2006-04-29 10:12:30
那天面试遇到几个题:
1,输入一个字符串,所有字符均为ASCII码,如果其中有两个或以上字符是相同的则返回1,否则返回0;
a. 写出一个你认为速度最快的算法
b. 写出一个占用空间最少的算法。

2。对于上述字符串,如果所有的字符的ASCII码都在0x20<=C<=0x7f之间,对于大于96个字符长度的字符串,有什么优化的方法,并写出代码。
...全文
323 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mhisky 2006-05-10
  • 打赏
  • 举报
回复
mark
tomtom123 2006-04-30
  • 打赏
  • 举报
回复
MARK
liusujian02 2006-04-30
  • 打赏
  • 举报
回复
可以邮箱联系:liusujian-duck@163.com
liusujian02 2006-04-30
  • 打赏
  • 举报
回复
看到你的这个题目,觉得挺好,但是由于机器现在没有安装C/C++的编译程序,所以只能略微表示自己的看法,现简单描述如下:
1、
a、时间最快(牺牲空间换取时间)
定义第一个结构数组(第一字段为ASCII字符,第二个字段为ASCII字符当前出现的次数)
定义第二个哈希表结构(第一个字段为KEY,第二个字段为ASCII字符在第一个结构数组中的
下标)
顺序查找输入字符串,并通过哈希表达式计算该字符在结构数组中的位置(直接一步到
位),并通过第二个字段判断是返回1还是0;
------------仅仅代表个人意见
b、空间最小
空间体现在:
1、存储输入的字符(必不可少)
就用这些存储就可以实现

实现步骤:(以两个相同为基准)
循环{
a、取得当前字符
b、从当前字符的下个字符循环至字符串尾
c、如果存在与当前字符一样的字符,则返回0,退出循环
d、如果不存在与当前字符一样的字符,则返回1,进入下轮循环
}

空间为存储字符的空间,时间复杂度:(1+2+3+.....+(n-1)) 也就是:N的平方
2、对于第二个问题,不太明白你的意思
只是知道0x20<=C<=0x7f最高位可以利用一下,可以描述的清楚一些吗?谢谢
或者我先理解一下,然后回复你吧!


桂林电子科技大学计算机系
信息管理与信息系统
2006.4.30
sharpdew 2006-04-30
  • 打赏
  • 举报
回复
我觉得应该扩展一下这个问题才有难度,就是:
如果字符串中包含汉字的话,其它同问题阐述一样,怎么办?
假设采用gbk编码。
sharpdew 2006-04-30
  • 打赏
  • 举报
回复
上面的代码连第二题也给你回答了!
sharpdew 2006-04-30
  • 打赏
  • 举报
回复
给你一个时间空间都很精简的:
char onesame(const char* p)
{
int mark[4] = {0};
int bit = 0x01;
for(; *p != 0; p++)
{
unsigned char m = (*p-1)/31;
unsigned char n = *p - 32*m-1;

if( mark[m] & bit << n )
return *p;
else
mark[m] = mark[m] | bit << n;
}
return 0;
}

int main()
{
const char* p = "abckcdbh";

cout << onesame(p) << endl;

return 0;
}
方法:位存储状态,位操作模拟字符计数。
fdimim 2006-04-29
  • 打赏
  • 举报
回复
1.
a)/////////////////////

bool finds(char * s)
{
char arr[128] = {0};

for(; *s != '\0'; ++s)
{
if(arr[int(*s)] == -1)
return true;
else
arr[int(*s)] = -1;
}

return false;
}

b)//////////////

bool finds(char * s)
{
if (s==NULL)
return false;
char * p = NULL;

for(; *s != '\0'; ++s)
for(p=s+1; *p!='\0'; ++p)
if(*p == *s)
return true;
return false;
}

2.大概是要用性能好些的搜索算法替换上面普通的
herman~~ 2006-04-29
  • 打赏
  • 举报
回复
顶一下

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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