问两个算法题

baidu01 2011-09-19 09:35:43
1.20亿个数如何排序?什么方法最好?

2.编码完成下面的处理函数。
函数将字符串中的字符'*'移到串的前部分,前面的非'*'字符后移,但不能改变非'*'字符的先后顺序,函数返回串中字符'*'的数量。如原始串为:ab**cd**e*12,处理后为*****abcde12,函数并返回值为5。(要求使用尽量少的时间和辅助空间)

...全文
312 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
shager 2011-09-23
  • 打赏
  • 举报
回复
int Foo(char *str)
{
ASSERT(str != NULL);

int count = 0;
int len = strlen(str);

for(int i = 0; i < len; i++)
{
if(str[i] == '*')
{
memmove(&str[count] + 1, &str[count], i - count);
str[count++] = '*';
}
}

return count;
}
bellbird 2011-09-22
  • 打赏
  • 举报
回复
第二题:返回*个数

int change(string & s)
{
int i,j,n=s.length();
j=n-1;
for(;;){
for(;j>=0&&s[j]!='*';j--);
if(j<0) return 0;
for(i=j-1;i>=0&&s[i]=='*';i--);
if(i<0) return j+1;
swap(s[i],s[j]);
}
}
低头思蚊香 2011-09-22
  • 打赏
  • 举报
回复
第二题,假设i是一个人,*是坑,他要从右往左成功走过一个字符串并记录坑的个数,i有两个物品k和j,k是一张纸用于记录坑的数量,j是i的字符发现装置,i现在开始走,遇到坑则不动,把k上的数加1,与此同时,i发出j,j从i处开始搜索字符,从i的左边找一个字符来填坑,坑填平后,i继续走,重复上述过程,直到i顺利通过字符串后,把k上交
yujunliang316 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 fengchaokobe 的回复:]
上面写错了,应该是

C/C++ code


j = 0;
for(i = 0; i < length; i++)
{
if(string[i] == '*')
{
string[j] <-> string[i];(交换)
j++;
}
}
[/Quote]

不能满足要求。
小绵羊 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 nkorange 的回复:]

第一题:分治。
第二题:不就是快速排序吗?
[/Quote]
快排貌似是不穩定排序,不能保證順序的吧
nkorange 2011-09-22
  • 打赏
  • 举报
回复
第一题:分治。
第二题:不就是快速排序吗?
小绵羊 2011-09-22
  • 打赏
  • 举报
回复

String str = "*bb*bbbb**c*d*e*****a";

char[] arr = str.toCharArray();

int k = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == '*') {
k++;
}
for (int j = arr.length - 1; j > i; j--) {
if (arr[j] == '*') {
arr[j] ^= arr[j - 1];
arr[j - 1] ^= arr[j];
arr[j] ^= arr[j - 1];
}
}
}

System.out.println(Arrays.toString(arr));
System.out.println(k);

冒泡排序,O(n^2)時間複雜度。。。。。
AndyZhang 2011-09-22
  • 打赏
  • 举报
回复
快速排序
DontKissBossAss 2011-09-22
  • 打赏
  • 举报
回复
第一题
楼主没有说明,20亿个什么样的数。
1: 位图, 很多时候用起来蛮爽得。
2: B~Tree,

第二题, 见19楼
accipiter11433 2011-09-21
  • 打赏
  • 举报
回复
对于第一题,一般机器的内存肯定不能容纳这么大的数据量,数据需要放在硬盘里,那么B+Tree是候选方法之一。
brentzj 2011-09-21
  • 打赏
  • 举报
回复
第2题可以用快排做
cnmhx 2011-09-20
  • 打赏
  • 举报
回复
第二题,是娱乐大家的游戏嘛?
bellbird 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 baidu01 的回复:]
1.20亿个数如何排序?什么方法最好?

2.编码完成下面的处理函数。
函数将字符串中的字符'*'移到串的前部分,前面的非'*'字符后移,但不能改变非'*'字符的先后顺序,函数返回串中字符'*'的数量。如原始串为:ab**cd**e*12,处理后为*****abcde12,函数并返回值为5。(要求使用尽量少的时间和辅助空间)
[/Quote]
快排吧,都是32位整数的话也才7G多点的内存
SuperFC 2011-09-20
  • 打赏
  • 举报
回复
上面写错了,应该是

j = 0;
for(i = 0; i < length; i++)
{
if(string[i] == '*')
{
string[j] <-> string[i];(交换)
j++;
}
}
SuperFC 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 baidu01 的回复:]


函数将字符串中的字符'*'移到串的前部分,前面的非'*'字符后移,但不能改变非'*'字符的先后顺序,函数返回串中字符'*'的数量。
[/Quote]

那意思就是可以改变非'*'字符的顺序吗?要是这样的话,就可以用o(n)的时间,O(1)的空间实现,代码如下:

j = 0;
for(i = 0; i < length; i++)
{
if(string[i] == '*')
{
string[j] <-> temp;
j++;
}
}
cfvmario 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lifu119 的回复:]

第二题时间复杂度有O(n^2)了吧引用 4 楼 lzc52151 的回复:

第一题一般是多路归并
第二题好像可以达到o(n)的时间,O(1)的空间。
两个指针,从后往前扫。i指针碰到*表示该位置要放一个数,j指针从i的前一个字符开始扫,如果不是星,则把该字符放到i指针所指向的地方,i指针向前走一位,j指针的字符置成*,如此扫到头即可~~
[/Quote]
8楼这么简单的算法都已经是O(n)的了啊,只是空间也要O(n)
lifu119 2011-09-20
  • 打赏
  • 举报
回复
第二题时间复杂度有O(n^2)了吧[Quote=引用 4 楼 lzc52151 的回复:]

第一题一般是多路归并
第二题好像可以达到o(n)的时间,O(1)的空间。
两个指针,从后往前扫。i指针碰到*表示该位置要放一个数,j指针从i的前一个字符开始扫,如果不是星,则把该字符放到i指针所指向的地方,i指针向前走一位,j指针的字符置成*,如此扫到头即可~~
[/Quote]
lifu119 2011-09-20
  • 打赏
  • 举报
回复
那样空间复杂度很高吧[Quote=引用 8 楼 chouy 的回复:]

第二题简单,如果是字符串,从后向前遍历,不是*的写入另一数组,最后把未填满的数组头全填*.
[/Quote]
超级大笨狼 2011-09-20
  • 打赏
  • 举报
回复
如果要排序的规模大于内存限制,可以采用B+Tree
asdf9666 2011-09-20
  • 打赏
  • 举报
回复
持续关注中。。。。。。。
加载更多回复(6)

33,009

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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