亡羊补牢-面试题

来源:百度文库 编辑:神马文学网 时间:2024/06/03 07:59:53

主  题:  亡羊补牢-面试题 
作  者:  0000000009 (韩雷) 
等  级:   
信 誉 值:  99 
所属社区:  C/C++ C语言 
问题点数:  20 
回复次数:  26 
发表时间:  2005-10-24 21:26:25 
  
 
  

 

前几天我在轮坛上贴出了我去一家公司面试遇到的题,当然面试的结果是以我的失败告终。
在我把我的代码贴出来后有许多DX给了我帮助和提示,按照这些我把我的程序修改了一下,请大家看看:

题目:
用户输入若干字符串,如果输入的是0000
表示结尾,对用户输入的字符串排序并输出到屏幕。

完整的代码:

#include "stdafx.h"


//------------------------------------
//字符链表结构
//------------------------------------
struct char_struct
{
        char a;
    char_struct* next;
};

//------------------------------------
//字符串链表结构
//------------------------------------
struct str_struct
{
char* str;
str_struct* next;
};

//------------------------------------------------------
//获取一个字符串
//------------------------------------------------------
int GetStr(char_struct* p)
{

char_struct *q;

int j = 0;

while(1)
{
   q = (char_struct*)malloc(sizeof(struct char_struct));


q->a = getchar();
j++;

p->next = q;
p=q;

if(q->a == ‘\n‘)
break;
}

p->next = NULL;

return j;

}

//------------------------------------------
//排序
//------------------------------------------
void str_sort(bool temp,str_struct *str_head,str_struct *str_p,str_struct *str_p_front,str_struct *str_temp)
{

// 为字符串排序所设的字符位置变量
int test_sort = 0;

if(temp == false)
{
str_head->next = str_temp;
   str_temp->next = NULL;
}


 while(temp)
 {

 while(
 (str_p->str[test_sort] != ‘\0‘)
 && (str_temp->str[test_sort] != ‘\0‘)
 && str_p->str[test_sort] == str_temp->str[test_sort]
 )
 {
test_sort++;
 }

 if( str_p->str[test_sort] < str_temp->str[test_sort])
 {
 if(str_p->next != NULL)
                 {
      str_p_front = str_p;
            str_p = str_p->next;
 }
 else
 {

 str_p->next = str_temp;
 str_temp->next = NULL;
    temp = false;
 }
 }
 else
 {
 str_p_front->next = str_temp;
       str_temp->next = str_p;
          temp = false;
 }
 }


}

//------------------------------------------
//输入字符串
//------------------------------------------
void InStr(str_struct *str_head)
{

str_struct *str_p, *str_p_front;

      str_p  =  (str_struct*)malloc(sizeof(struct str_struct));
str_p_front  =  (str_struct*)malloc(sizeof(struct str_struct));

str_p->next = NULL;
str_p->str = NULL;

str_head->next = str_p;

 char_struct *temp_end;

temp_end = (char_struct*)malloc(sizeof(struct char_struct));


//为检测字符串所设的中间变量
char chr_test_end = 0;

// 为跳出循环
bool temp = false;
int i = 0;
int j = 0;
str_struct *str_temp;

char_struct* head, *p;

while(1)
{
    head = p = (char_struct*)malloc(sizeof(struct char_struct));
str_p = str_head->next;
str_p_front = str_head;

printf("into please: ");

p = head;

head->a = getchar();
head->next = NULL;


if(head->a != ‘\n‘)
{

j = GetStr(p);

printf("\n");


str_temp = (str_struct*)malloc(sizeof(struct str_struct));


 str_temp->str = (char*)malloc((j+1)*sizeof(char));

  memset(str_temp->str,‘\0‘,(j+1));


temp_end = head;


 for(int k=0;k {
 str_temp->str[k] = head->a;


          head = head->next;
 }
 

str_sort( temp, str_head,str_p,str_p_front,str_temp);

 

j = 0;
temp = true;

 

while( (temp_end->a == ‘0‘) && (i < 5) )
{
++i;
temp_end = temp_end->next;
}

chr_test_end = temp_end->a;

while(head != NULL)
{
p = head;
head = head->next;
free(p);
}

if( (chr_test_end ==‘\n‘)
&&   (i==4) ) break;

i = 0;

}

}

}


//----------------------------------------
// main
//----------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{

str_struct *str_head, *str_temp;

str_head  =  (str_struct*)malloc(sizeof(struct str_struct));
str_temp =   (str_struct*)malloc(sizeof(struct str_struct));

 str_head->str = NULL;

 InStr(str_head);

str_head = str_head->next;
str_temp = str_head;


while(str_head != NULL)
{

printf("\n");
printf("%s",str_head->str);
printf("\n");

str_head = str_head->next;
}

while(str_temp != NULL)
{
str_head = str_temp;
str_temp = str_temp->next;
free(str_head->str);
free(str_head);
}

printf("\n");

return 0;
}

请各位对我的代码畅所欲言,批评的越尖锐我越高兴,谢谢先!


 
  回复人: v41dugu(一步一生) ( ) 信誉:105  2005-10-24 21:30:31  得分: 0 
 
 
  
先顶。。。。。

 
 
Top 
 
 回复人: tyt2008cn(风语者) ( ) 信誉:100  2005-10-24 22:03:19  得分: 0 
 
 
  
SO 短的题目, SO长的程序啊, 先顶了,在慢慢看!

 
 
Top 
 
 回复人: codearts(代码艺术) ( ) 信誉:98  2005-10-24 22:20:34  得分: 0 
 
 
  
顶先,题太长,看得眼花


 
 
Top 
 
 回复人: csucdl(csucdl) ( ) 信誉:100  2005-10-24 22:56:49  得分: 0 
 
 
  
可以巩固基础啊
不过太长了,不想看

 
 
Top 
 
 回复人: yuanarea(超级赛亚人) ( ) 信誉:100  2005-10-25 6:47:37  得分: 0 
 
 
  

 
 
Top 
 
 回复人: ErikChen1985() ( ) 信誉:100  2005-10-25 7:11:50  得分: 0 
 
 
  
有没用二叉树啊,用了的话就不用你那个排序算法了。

 
 
Top 
 
 回复人: MarcoCC(天蓝蓝,海蓝蓝) ( ) 信誉:100  2005-10-25 9:11:51  得分: 0 
 
 
  
算法怎么样没仔细看,不过看了一下程序的结构,既然是用C++来写代码,为什么没有类的概念?还有一些过长的函数,不能再细分功能,化成更简洁、结构更简单的函数?感觉楼主在用C的思想写C++的代码

 
 
Top 
 
 回复人: MarcoCC(天蓝蓝,海蓝蓝) ( ) 信誉:100  2005-10-25 9:21:51  得分: 0 
 
 
  
不好意思,看错了,这里是C论坛,上面的话我收回,sorry

 
 
Top 
 
 回复人: xiaocai0001(萧筱雨) ( ) 信誉:100  2005-10-25 9:28:37  得分: 0 
 
 
  
struct char_struct
{
        char a;
    char_struct* next;
};

这种结构千万要不得

一个数据域才1个字节
一个指针域就4个字节了
实际的内存利用率才25% , 空间效率太低!
同时,程序写得过长,不够简洁,面试时若对于这样的题写出这样的程序,结果不会好到哪去的。

 
 
Top 
 
 回复人: xiaocai0001(萧筱雨) ( ) 信誉:100  2005-10-25 9:48:35  得分: 0 
 
 
  
Sorry
实际的空间利用率是20%,而不是25%

 
 
Top 
 
 回复人: hbvanguard() ( ) 信誉:100  2005-10-25 10:00:20  得分: 0 
 
 
  
程序风格不好,要严格遵守代码规约,没有一点层次感,让人不想看。

 
 
Top 
 
 回复人: cquazhi(阿志) ( ) 信誉:100  2005-10-25 10:02:14  得分: 0 
 
 
  
楼主,我是新手,不敢对你的程序指手画脚,谈谈我的想法。

题目:
用户输入若干字符串,如果输入的是0000
表示结尾,对用户输入的字符串排序并输出到屏幕。

分析:
用户输入的是字符串,那么设一个字符数组 char string[] 来存储用户所输入的字符串。然后判断该字符串是不是“0000”,若是则结束程序;否则对该字符串进行排序算法并输出结果。

在你的程序中,你似乎是想定义一个单链表结构,每输入一个字符就实时进行排序插入运算,但题意中似乎没有这个要求啊。

欢迎大家批评指正,我还是新手呢,请多指教。

 
 
Top 
 
 回复人: cquazhi(阿志) ( ) 信誉:100  2005-10-25 10:04:05  得分: 0 
 
 
  
哦,忘了加入循环结构了。若所输入的字符串不是“0000”,在排序输出之后要循环输入字符串的。

 
 
Top 
 
 回复人: prince110(老顽童) ( ) 信誉:100  2005-10-25 10:13:32  得分: 0 
 
 
  
楼主,我也觉得你写的太复杂(肯能我太菜),有点看不懂!觉得 cquazhi(阿志) 说得有理。你可以考虑一下呀

 
 
Top 
 
 回复人: beihanggo(风平浪静) ( ) 信誉:100  2005-10-25 10:50:07  得分: 0 
 
 
  
一个面试也这么多,你还有多少时间考虑其他的呢?


 
 
Top 
 
 回复人: wxyeeis(雨) ( ) 信誉:100  2005-10-25 11:02:57  得分: 0 
 
 
  
mark

 
 
Top 
 
 回复人: deping_chen(小平) ( ) 信誉:100  2005-10-25 11:29:35  得分: 0 
 
 
  
应该用不超过30个语句就可以解决的问题。楼主什么都自己做,而且做得很不好。
譬如,保存字符串可以用CStringArray或Vector,循环读入直到字符串等于0000,排序可以用qsort库函数,只需写一个简短的比较函数就行了,然后循环输出。
#include
#include
#include
#include
using namespace std;

int comparestring(const string& p1, const string& p2)
{
return (p1.compare(p2) < 0);
}

void main()
{
vector inputs;
string input;
while(true)
{
cin >> input;
if(strcmp(input.data(),"0000")==0)
break;
inputs.push_back(input);
}
sort(inputs.begin() , inputs.end(), comparestring);
for(unsigned int i=0; i{
cout << inputs[i] << endl;
}
}

 
 
Top 
 
 回复人: deping_chen(小平) ( ) 信誉:100  2005-10-25 11:35:17  得分: 0 
 
 
  
struct char_struct
{
        char a;
    char_struct* next;
};

这种结构千万要不得
======================
支持。
而且内存利用率是低于%20的。因为数据char_struct通常会对齐到4字节,这样就只有1/8的利用率,如果是new或malloc出来的,还有内存头的开销,这样就小于1/8了。

 
 
Top 
 
 回复人: Kenny_Glacier(冰坼) ( ) 信誉:100  2005-10-25 13:11:18  得分: 0 
 
 
  
mark

 
 
Top 
 
 回复人: ckp(surge) ( ) 信誉:100  2005-10-25 13:32:01  得分: 0 
 
 
  
so long............,回去慢慢研究先。

 
 
Top 
 
 回复人: h2plus0(~~~) ( ) 信誉:99  2005-10-25 13:44:22  得分: 0 
 
 
  
一个更简单的办法是
冒泡排序。

哈哈, 我就记得这个算法

 

 
 
Top 
 
 回复人: 0000000009(韩雷) ( ) 信誉:99  2005-10-25 15:20:00  得分: 0 
 
 
   关于用vector,那是C++,但我在用C 纯C :)

关于

struct char_struct
{
        char a;
    char_struct* next;
};

利用率低,我想和大家讨论一下,当我刚接触这题时,我第一个想法是这样:

char temp_str[100];

以这样一个字符串数组来做临时变量,但题目并没有规定一个字符串最多有多少个字符
所以我想问一下,像这样的情况应该如何定义变量?在C中如何定义一个可以存储一个无限长
的字符串的方法? 当然,理论上我的定义方法也是有边界的,但应该是4G内存。


 
 
Top 
 
 回复人: 0000000009(韩雷) ( ) 信誉:99  2005-10-25 15:31:00  得分: 0 
 
 
   这个程序中函数很长,没有通用性,这些我应该再修改。

但整个程序太长,我还真没感觉那些代码是无用的,甚至我觉得在一些地方还差点
检测机制,比如输入一个字符串后应该检查一下malloc是否成功:

例如:
str_p  =  (str_struct*)malloc(sizeof(struct str_struct));
这句后还应该再加一句:
if(str_p == NULL) printf("错误,内存申请失败!\n");
exit(1);

怎样让代码减少,还请各位指点一下,谢谢。
 
 
Top 
 
 回复人: xiaocai0001(萧筱雨) ( ) 信誉:100  2005-10-25 15:45:00  得分: 0 
 
 
   我感觉是, 楼主对于出错想得太多了

你可以定义一个缓冲区.
缓冲区大小由你自己定义, 如果用户输入超过你缓冲区所能容纳的, 你的程序完全可以报错,不让输入那么多, 没有必要用一个链表来实现让用户随便输入都行.
若那样的话, 内存也是有限的, 真要验证你的程序的话, 我就一直输入, 输入上亿个字符, 硬是把你的内存耗完, 那你又该怎么办?

所以程序应该能够处理绝大多数的情况就可以了, 对于那些非正常的情况, 不必要都去处理, 程序直接报错就可以.
 
 
Top 
 
 回复人: benny106(倚天) ( ) 信誉:100  2005-10-25 16:10:00  得分: 0 
 
 
   简单的程序让楼住想复杂了~~~
用循环比较就可以了哦!
直到0000退出程序!
个人认为哦
 
 
Top 
 
 回复人: 0000000009(韩雷) ( ) 信誉:99  2005-10-25 17:51:00  得分: 0 
 
 
   好吧,是我太较真了。
谢谢大家!
 
 
Top