MIK C语言面试两题
这是一个读者朋友在知识星球上提到的两个笔试题,第一个题目比较简单,关键在第二个题目「编程题」,我文章中写的解题思路应该不是最好的,希望大神读者们给出更好的答案,让这个充满乐趣的程序世界再增添一些乐趣吧,所以, show your code .
第一题,求如下输出
#include "stdio.h"
#define m(x,y) (x)<(y)?x:y
int main()
{
printf("%d\n",10*m(10,15));
return 0;
}
如果是学生的话,建议先看看题目,然后心里默念一下再往下看答案,我知道是一个非常简单的题目,但是也不要掉以轻心。
输出:
15
--------------------------------
Process exited after 0.2808 seconds with return value 0
请按任意键继续. . .
编程题
输入一个字符串 然后判断里面最多的字符是什么 大写小写都要独立计数。
#include "stdio.h"
#include "string.h"
#define m(x,y) (x)<(y)?x:y
int main()
{
int i=0,j=0,m=0;
char s[100];
char r[255];
memset(r,0,sizeof(r));
memset(s,0,sizeof(s));
gets(s);
m=strlen(s);
printf("%d %s\n",m,s);
for(i=0;i
{
r[s[i]]++;
//putchar(s[i]);
}
printf("\n----------\n");
for(i=0;i<255;i++)
printf("%d ",r[i]);
printf("\n----------\n");
for(i=0;i<255;i++)
{
char tmp = 0;
for(j=0;j<255-i;j++)
{
if(r[i] > r[j])
{
tmp = r[j];
r[j]=r[i];
r[j]=r[i];
}
}
}
printf("\n----p------\n");
for(i=0;i<255;i++)
printf("%d ",r[i]);
printf("\n----------\n");
printf("%d\n",r[254]);
return 0;
}
上面是一个读友提出的解决方案,不过我对这个方案不是很满意「主要觉得代码行数有点多」,冥思苦想之后,想了下面这个更愚蠢的办法
#include "stdio.h"
#include "string.h"
#include "stdint.h"
int main(void)
{
char s[100];
uint16_t r[100];
int m=0,i=0,j=0;
uint8_t temp=0,max=0;
memset(s,0,sizeof(s));
memset(r,0,sizeof(r));
gets(s);
m = strlen(s);
for(i=0;i
{
for(j=0;j
{
if( s[i] != ((r[j]>> 8)&0xFF) )
{
if(r[j] == 0)
{
r[j] = (s[i] << 8)&0xFFFF;
r[j] += 0x0001;
break;
}
}
else
{
r[j] += 0x0001;
break;
}
}
}
temp = r[0]&0xFF;
for(i=0;i
{
if(r[i] != 0)
printf("%c:%d\n",r[i]>>8,r[i]&0xFF);
if((r[i]&0xFF) > temp)
{
temp = r[i]&0xFF;
max = i;
}
}
printf(">>>%c:%d\n",r[max]>>8,r[max]&0xFF);
return (0);
}
我还是认为这不是最好的方案,然后在知识星球上有一个读者评论,我看了评论受到启发,又进化了一次。
这个思路和上面的第一段代码差不多,遍历字符串里面的每一个字符,因为字符是char 类型,所以字符的值和「0-255」是对应关系的,然后再判断相同字符,如果和「0-255」的某个位置相同,那么这个位置的数组的值就加1。
然后寻找最大只的时候,也要遍历一遍。
有个弊端,就是如果同时存在几个相同最多字符的时候,要如何把他们同时输出的问题,如果使用我第二个方法的话,可以比较容易修改。
代码如下:
#include "stdio.h"
#include "string.h"
#include "stdint.h"
int main()
{
uint8_t i=0,temp=0;
uint8_t cos = 0;
char s[100];
char r[255];
memset(r,0,sizeof(r));
memset(s,0,sizeof(s));
gets(s);
i=strlen(s);
printf("%d\n%s\n",i,s);
for(i=0;i
{
r[s[i]]++;
}
temp = r[0];
cos = 0;
for(i=0;i
{
if(r[i] > temp)
{
temp = r[i];
cos = i;
}
}
printf("%d:%c:%d\n",cos,(char)cos,r[cos]);
return 0;
}
评论