首页 文章详情

MIK C语言面试两题

嵌入式Linux | 523 2020-08-12 20:30 0 0 0
UniSMS (合一短信)

这是一个读者朋友在知识星球上提到的两个笔试题,第一个题目比较简单,关键在第二个题目「编程题」,我文章中写的解题思路应该不是最好的,希望大神读者们给出更好的答案,让这个充满乐趣的程序世界再增添一些乐趣吧,所以, show your code .


第一题,求如下输出

#include "stdio.h"
#define m(x,y) (x)<(y)?x:yint 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:yint 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;}


 推荐阅读:
    专辑|Linux文章汇总
    专辑|程序人生
    专辑|C语言


嵌入式Linux
微信扫描二维码,关注我的公众号 
good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter