藏族舞欢乐的海洋:这道面试题我错在哪了?

来源:百度文库 编辑:九乡新闻网 时间:2024/05/03 11:51:42

主  题:  这道面试题我错在哪了? 
作  者:  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就不用修改