这道面试题我错在哪了?

来源:百度文库 编辑:神马文学网 时间:2024/04/29 03:47:15
主  题:  这道面试题我错在哪了?
作  者:  0000000009 (韩雷)
等  级:
信 誉 值:  99
所属社区:  C/C++ C语言
问题点数:  20
回复次数:  26
发表时间:  2005-10-14 14:14:13
前一段时间我去了一家公司面试,他们给我出了道题:
用户输入若干字符串,如果输入的是0000
表示结尾,对用户输入的字符串排序并输出到屏幕。
我的答案是:
(不好意思,有点长)
#include "stdafx.h"
using namespace std;
// 字符链表结构
struct char_struct
{
char a;
char_struct* next;
};
// 字符串链表结构
struct str_struct
{
char* str;
str_struct* next;
};
//----------------------------------------------
// main
//----------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
int i = 0;
int j = 0;
int testforPaiXu = 0;
bool temp = false;
str_struct *str_head, *str_p, *str_q, *str_p_shang;
str_head  =  (str_struct*)malloc(sizeof(struct str_struct));
str_p  =  (str_struct*)malloc(sizeof(struct str_struct));
str_p_shang =   (str_struct*)malloc(sizeof(struct str_struct));  // 排序时链表中上一个结构的暂存
str_head->next = str_p;
str_head->str = NULL;
str_p->next = NULL;
str_p->str = NULL;
char_struct* head, *p, *q, *temp_end;
temp_end = (char_struct*)malloc(sizeof(struct char_struct));
head = p = (char_struct*)malloc(sizeof(struct char_struct));
// while 1 begin
while(1)
{
str_p = str_head->next;
str_p_shang = str_head;
cout << " into please: ";
p = head;
head->a = getchar();
head->next = NULL;
//如果用户输入的第一个字母不是回车
if(head->a != ‘\n‘)
{
//while 2 begin
while(1)
{
q = (char_struct*)malloc(sizeof(struct char_struct));
q->a = getchar();
j++;
p->next = q;
p=q;
if(q->a == ‘\n‘)
break;
}
// while 2end
p->next = NULL;
cout << endl;
//将char_struct字符串链表内容装入一个char*
str_q = (str_struct*)malloc(sizeof(struct str_struct));
//malloc一个与刚输入的字符序列大小一致的char*空间
str_q->str = (char*)malloc((j+1)*sizeof(char));
memset(str_q->str,‘\0‘,(j+1));//memset用来对一段内存空间全部设置为某个字符。
//为测试是否为结尾
temp_end = head;
//倒入
for(int k=0;k{
str_q->str[k] = head->a;
head = head->next;
}
// 排序
if(temp == false)
{
str_head->next = str_q;
str_q->next = NULL;
}
// while 3 begin
while(temp)
{
//如果两个字符串的第testforPaiXu位相同
while(
(str_p->str[testforPaiXu] != ‘\0‘)
&& (str_q->str[testforPaiXu] != ‘\0‘)
&& str_p->str[testforPaiXu] == str_q->str[testforPaiXu]
)
{
testforPaiXu++;
}
if( str_p->str[testforPaiXu] < str_q->str[testforPaiXu])
{
if(str_p->next != NULL)
{
str_p_shang = str_p;
str_p = str_p->next;
}
else
{
//将 str_q 加在最后
str_p->next = str_q;
str_q->next = NULL;
temp = false;
}
}
else
{
str_p_shang->next = str_q;
str_q->next = str_p;
temp = false;
}
}
// while 3 end
temp = true;
testforPaiXu = 0;
j = 0;
while(temp_end->a == ‘0‘)
{
++i;
temp_end = temp_end->next;
}
if( (temp_end->a ==‘\n‘)
&&   (i==4) ) break; // 输入的字符串为 "0000"
i = 0;
}
}
// while 1 end
str_head = str_head->next;
//输出
while(str_head != NULL)
{
cout  << endl;
cout << str_head->str << endl;
str_head = str_head->next;
}
cout << endl;
return 0;
}
面试的人没说什么,让我回去等,结果我就等啊等...最后没结果:(
我把代码贴出来,请大家费心看看,错在那里?
谢谢
回复人: icecools(浮生若梦) ( ) 信誉:99  2005-10-14 14:23:26  得分: 0
代码没看,不过面试没结果不一定就是你题目做得不好,有很多种原因的,有的时候就是面试管看你不爽,没啥其他的理由,而且面试的时候要写这么多代码?也太那啥了,说个思路不就得了嘛
Top
回复人: kobefly(科比--网络学习中) ( ) 信誉:121  2005-10-14 14:33:15  得分: 0
面试可以写这么长?
pfpf
Top
回复人: yanxiazhiqiu(十一月落下的雨水冰冷的像是一种预言) ( ) 信誉:100  2005-10-14 14:52:40  得分: 0
我始终有个观点:自己应该对自己的代码负责。
Top
回复人: lengxiao_wang() ( ) 信誉:100  2005-10-14 15:07:55  得分: 0
说你两句:
首先你没有释放动态分配的内存,有可能会造成内存泄漏!
第二,代码太冗长,主考官会疯的:我给一段程序:
#include
#include
#include
#include
using namespace std;
using std::string;
using std::vector;
using std::endl;
int main()
{
vector vContain;
string strInput;
int i=0;
std::vector::iterator pos;
vContain.reserve(1000);
std::cout<<"Please enter string,and finish your input with ‘0000‘ !\n";
while(1)
{
//cin>>_intName;
std::cin>>strInput;
if(strInput == "0000")
break;
vContain.push_back(strInput);
//std::cout<}
sort(vContain.begin(),vContain.end());
std::cout<<"\nYour input after sort:\n";
for(pos = vContain.begin(); pos != vContain.end(); ++pos)
cout<<*pos<return 0;
}
Top
回复人: tiaoci(我挑刺,我快乐) ( ) 信誉:100  2005-10-14 15:29:57  得分: 0
你的代码肯定是有问题的啦,不过录不录用和代码没有太大关系
Top
回复人: pc2s(火麒麟) ( ) 信誉:100  2005-10-14 16:55:06  得分: 0
另外,我觉得你把所有的算法写在一个函数里面,看起来很乱的。
如果能把部分功能分开写(比如输入、排序、输出),最起码看起来整齐,给考官一种思路清晰的感觉。
Top
回复人: csucdl(csucdl) ( ) 信誉:100  2005-10-14 20:51:05  得分: 0
void InterChange(string& x1, string& x2)
{
string x = x1;
x1 = x2;
x2 = x;
return;
}
int Partition(string A[], const int& left, const int& right)
{
int i = 0;
int k = 0;
string v ;
i = left;
k = right;
v = A[left];
while(true)
{
do
{
i++;
}while(A[i].compare(v) == -1 && i < right - 1);
do
{
k--;
}while(A[k].compare(v) == 1 && k > 0);
if(i < k)
{
InterChange(A[i], A[k]);
}
else
{
break;
}
}
A[left] = A[k];
A[k] = v;
return k;
}
void QuickSort(string A[], const int& left, const int& right)
{
int j = 0;
if(left < right)
{
j = right + 1;
j = Partition(A, left, j);
QuickSort(A, left, j - 1);
QuickSort(A, j + 1, right);
}
return;
}
int main()
{
vector strings;
string sinput;
while(cin>>sinput)
{
if(sinput == "0000")
{
break;
}
else
{
strings.push_back(sinput);
}
}
QuickSort(strings.begin(), 0, strings.size() - 1);
for(string* cp = strings.begin(); cp != strings.end(); cp++)
{
cout<<*cp<<" ";
}
cout<return 0;
}
Top
回复人: jay0518(jay) ( ) 信誉:100  2005-10-14 21:00:37  得分: 0
我觉得楼主c学的很好啊
什么时候有时间能指教一下啊
Top
回复人: karlfly(flykarl) ( ) 信誉:100  2005-10-14 21:38:36  得分: 0
楼主写的也太长了
Top
回复人: mainwind(风想) ( ) 信誉:99  2005-10-14 23:50:51  得分: 0
楼主写的太长了,这个没有必要这样写的!!
Top
回复人: vvrreet(vvrreet) ( ) 信誉:99  2005-10-15 0:07:34  得分: 0
关注一下,顶!!!!
Top
回复人: superdullwolf(超级大笨狼,每天要自强) ( ) 信誉:100  2005-10-15 11:04:00  得分: 0
面试没结果不一定就是你题目做得不好,有很多种原因的。
昨天我就招聘别人,准备了题目,不合适的人问了好多试题,合适的人说几句话就不用问试题了。
Top
回复人: superdullwolf(超级大笨狼,每天要自强) ( ) 信誉:100  2005-10-15 11:09:00  得分: 0
哦,你一个函数的确是太长了。
Top
回复人: superdullwolf(超级大笨狼,每天要自强) ( ) 信誉:100  2005-10-15 11:13:00  得分: 0
有时候我倒希望我们的工作经常用一些学校里面学的东西,可是不是这样的,有些知识很想巩固一下。
Top
回复人: NuclearG(NuclearG) ( ) 信誉:100  2005-10-15 13:42:00  得分: 0
这世上有的考官出这么简单的题是要看看你会不会写注释地...
Top
回复人: Free_Wind22(自由的风) ( ) 信誉:100  2005-10-15 15:33:00  得分: 0
C++为什么不用泛型算法???
要写这么多?
copy sort
Top
回复人: smz1314(菜8) ( ) 信誉:100  2005-10-15 17:05:00  得分: 0
太长了,考官也不会看完的。
请问用了多长时间写完的。
Top
回复人: zoulie(珠峰菜鸟) ( ) 信誉:100  2005-10-15 19:52:00  得分: 0
这么长啊,看懂思路就可以了
Top
回复人: hualin007(朱西邦德) ( ) 信誉:100  2005-10-15 20:18:00  得分: 0
我前几天面试给出了个字符压缩的算法题,当时不会做,后来回来查资料求人,结果那个程序要老长老复杂才弄的出来,面试那一会怎么能写的出来。
Top
回复人: Baku(.NET上的白痴) ( ) 信誉:100  2005-10-15 20:36:00  得分: 0
用STL,里面有排序的啊,写的好复杂,还有BUG 。。。
Top
回复人: hao0228(嘲笑灾害) ( ) 信誉:100  2005-10-15 21:04:00  得分: 0
都是高手,我的好好学习学习。
Top
回复人: lindex(this) ( ) 信誉:99  2005-10-15 21:37:00  得分: 0
为什么不用桶排序阿?建一个桶bucket[256],每出现一个字符c,则将bucket[c]增加1。
Top
回复人: flyinger(风往北吹) ( ) 信誉:105  2005-10-15 22:11:00  得分: 0
haha
Top
回复人: gamelearner(秋刀鱼) ( ) 信誉:100  2005-10-15 23:23:00  得分: 0
#pragma warning(disable: 4786)
#include
#include
#include
#include
#include
using namespace std;
void main()
{
vector SV;
string s;
while (cin >> s)
{
if (s == "0000") break;
SV.push_back(s);
}
sort(SV.begin(), SV.end());
ostream_iterator OS(cout, "\n");
copy(SV.begin(), SV.end(), OS);
}
Top
回复人: v41dugu(一步一生) ( ) 信誉:105  2005-10-16 13:06:00  得分: 0
呵呵 就是这样了
Top
回复人: 0000000009(韩雷) ( ) 信誉:99  2005-10-16 16:12:00  得分: 0
我是这样理解的:
题目没有说明可以有多少个字符串及每个字符串有多少字符,开始我用C++的方法,
用容器vector,做完后他让我用C的方法实现,当然只是主要部分,像cin cout就不用修改