如下几个问题,请大家仔细考虑,看谁的方法最好,最优

xiaoshi0 2006-05-30 03:06:24
1.

现在给出一个字符串,如:"1#2#3#4#", "111###222###555###"等等

字符串是由所有可见符号组成

现要求设计一个函数,将输入的字符串中的指定字符放在该字符串的最后面,且字符串中原来的字符顺序保持不变,返回指定字符个数。

根据上例,如果要提取'#'这个字符,则字符串分别变为:"1234####", "111222555#########",返回值分别为:4和9

函数原型如下:

int PickupChar(char * pData, char ch);//pData代表目标字符串,ch代表要提取的字符

注:字符串为ANSI字符串,不考虑Unicode编码

给分原则:编写代码最优化,行数最少的给50分。

2.

SuDoKu是一种叫做九宫格的游戏,游戏规则可以上网查一下(要是我说的话就太多了),现在要求一种算法,要用随机的方法取得该游戏的一个解。

注: 要用随机的方法生成,生成时间尽可能的短。

给分原则:满足以上条件的最好的算法给150分。
...全文
269 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoshi0 2006-05-31
  • 打赏
  • 举报
回复
第一个问题其实是华为3com公司内部的一到练习题,属于最简单的一道

第二个问题是一位网友问我的问题,虽然我有自己的解决方法,但想看看大家有没有更好的方法。

哪位有时间可以看看第二题的实现

第一题的分数决定给cczlp了
daydayup234 2006-05-31
  • 打赏
  • 举报
回复
向cczlp(不惑)学习,谢谢
我那个while太差
xiaoshi0 2006-05-31
  • 打赏
  • 举报
回复
楼上的代码多了初期定位首个提取字符的操作。

这样的操作其实cczlp的代码就已经可以很好的实现。

多余的代码部分在首个字符就为提取字符的情况下不起任何作用
僵哥 2006-05-31
  • 打赏
  • 举报
回复
上面的语句稍写得复杂了点

int PickupChar(char * pData, char ch)
{
int i = 0, j ;
//不包含ch的前置段,不做移动操作
while(pData[i]!=ch&&pData[i]!='\0')i++;
j=i;

for (; pData[i] != '\0'; i++)
{
if (pData[i] != ch)
{
pData[j++] = pData[i];
}
}

memset(pData + j, ch, i - j);

return i - j;
}
僵哥 2006-05-31
  • 打赏
  • 举报
回复
稍稍较cczlp的做了点改善

int PickupChar(char * pData, char ch)
{
int i = 0, j ;
//不包含ch的前置段,不做移动操作
for (; pData[i] != '\0'; )
{
if(pData[i]==ch)
break;
i++;
}
j=i;
for (; pData[i] != '\0'; i++)
{
if (pData[i] != ch)
{
pData[j++] = pData[i];
}
}

memset(pData + j, ch, i - j);

return i - j;
}
xiaoshi0 2006-05-31
  • 打赏
  • 举报
回复
楼上几位的代码都太强调语句简单了

没有考虑调用的开销

其实第一题的真正愿意是希望不用任何库函数编写,呵呵
cczlp 2006-05-31
  • 打赏
  • 举报
回复
楼上的可以这样写:
#include <StrUtils.hpp>
int PickupChar(char * pData, char ch)
{
AnsiString s = AnsiReplaceStr(pData, ch, "\0");
int Len = strlen(pData) - s.Length();
strcpy(pData, (s + DupeString(ch, Len)).c_str());
return Len;
}

就是效率差些,
如果不管效率, 只想写最少行数代码, 可以用一行:

int PickupChar(char * pData, char ch)
{
return strlen(pData) - AnsiString(strcpy(pData, (AnsiReplaceStr(pData, ch, "\0") + DupeString(ch, strlen(pData))).SetLength(strlen(pData)).c_str())).Pos(ch) + 1;
}

daydayup234 2006-05-31
  • 打赏
  • 举报
回复
第一题,这个行不

AnsiString s(pData);
int ret,k;
k=s.Length();
s=AnsiReplaceStr(s,ch,"\0");
ret=k-s.Length();
s+=s.StringOfChar(ch,k-s.Length());
while(k-->1) pData[k]=s[k];
return ret;
xiaoshi0 2006-05-30
  • 打赏
  • 举报
回复
这种东西,你可以借鉴嘛!

想想人家的思路!

以后一样能编出这样的算法。
ROCKET001 2006-05-30
  • 打赏
  • 举报
回复
本来我也想写的,但看一下cczlp(不惑)写的,我不用写了
人家得50分,我30分,两个级别啊

我多想与cczlp(不惑)和楼主交个朋友啊!!!
ROCKET001 2006-05-30
  • 打赏
  • 举报
回复
cczlp(不惑)写的确实好,顶
wjsoft1 2006-05-30
  • 打赏
  • 举报
回复
刚刚太忙,呵呵
没有检查
cczlp(不惑) 已经最好方法了
xiaoshi0 2006-05-30
  • 打赏
  • 举报
回复
大家可以仔细考虑一下第二题,不是很好做的
Ericcsdn 2006-05-30
  • 打赏
  • 举报
回复
接分 来的
xiaoshi0 2006-05-30
  • 打赏
  • 举报
回复
楼上的代码

如果字符串的第一个字符就是要提取的字符,你的功能还正确么?

你的函数没有返回值

你的函数的比较次数要多一些,因为如果进行了字符交换,就要在交换后从当前交换字符的下一个开始,多了查找时间
wjsoft1 2006-05-30
  • 打赏
  • 举报
回复
我的比较复杂,方法不同
int PickupChar(char * pData, char ch)
{
int save_pos=0;
for(int i=0;pData[i]!=0;i++){
if(pData[i]==ch&&!save_pos)save_pos=i;
else if(pData[i]!=ch&&save_pos){
pData[save_pos]=pData[i];
pData[i]=ch;
i=save_pos+1;
save_pos=0;
}

}
}
xiaoshi0 2006-05-30
  • 打赏
  • 举报
回复
楼上代码正确,大家看有没有代码写的比他的还简单的。
cczlp 2006-05-30
  • 打赏
  • 举报
回复
int PickupChar(char * pData, char ch)//pData代表目标字符串,ch代表要提取的字符
{
int i = 0, j = 0;

for (; pData[i] != '\0'; i++)
{
if (pData[i] != ch)
{
pData[j++] = pData[i];
}
}

memset(pData + j, ch, i - j);

return i - j;
}
xiaoshi0 2006-05-30
  • 打赏
  • 举报
回复
题目中说过了

将输入的字符串中的指定字符放在该字符串的最后面,且字符串中原来的字符顺序保持不变,返回指定字符个数。

以上是要求
Jim@luckeeinc.com 2006-05-30
  • 打赏
  • 举报
回复
int PickupChar(char * pData, char ch);//pData代表目标字符串,ch代表要提取的字符
//--------------------

只要统计个数?

13,874

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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