姓名:朱军伟 学号:19170100001 学院:电子工程学院 班级:1902015
原文转自:https://download.csdn.net/download/sun_jfly/4326176?utm_medium=distribute.pc_relevant_t0.none-task-download-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-download-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control
【嵌牛导读】任何行业的终极目标都是为了谋求发展,嵌入式作为一个前沿行业,我们有必要熟悉一下常见的面试题,我将此作为一个系列发布。
【嵌牛鼻子】嵌入式行业面试题
【嵌牛提问】如何轻松应对嵌入式行业面试?
【嵌牛正文】
1.给两个数组和他们的大小,还有一动态开辟的内存,求交集,把交集放到动态内存 dongtai,
并且返回交集个数
long jiaoji(long* a[],long b[],long* alength,long blength,long* dongtai[])
2.单连表的建立,把'a'--'z'26 个字母插入到连表中,并且倒叙,还要打印!方法 1:
typedef struct val
{ int date_1;
struct val *next;
}*p;
void main(void)
{ char c;
for(c=122;c>=97;c--)
{ p.date=c;
p=p->next;
}
p.next=NULL;
}
}
方法 2:
node *p = NULL;
node *q = NULL;
node *head = (node*)malloc(sizeof(node));
head->data = ' ';head->next=NULL;
node *first = (node*)malloc(sizeof(node));
first->data = 'a';first->next=NULL;head->next = first;
p = first;
int longth = 'z' - 'b';
int i=0;
while ( i<=longth )
{
node *temp = (node*)malloc(sizeof(node));
temp->data = 'b'+i;temp->next=NULL;q=temp;
head->next = temp; temp->next=p;p=q;
i++;
}
print(head);
3.可怕的题目终于来了
象搜索的输入信息是一个字符串,统计 300 万输入信息中的最热门的前十条,我们每次输入
的一个字符串为不超过 255byte,内存使用只有 1G,请描述思想,写出算发(c 语言),空间和时间复杂度,
4.国内的一些帖吧,如 baidu,有几十万个主题,假设每一个主题都有上亿的跟帖子,怎么样
设计这个系统速度最好,请描述思想,写出算发(c 语言),空间和时间复杂度,
#include string.h
main(void)
{ char *src="hello,world";
char *dest=NULL;
dest=(char *)malloc(strlen(src));
int len=strlen(str);
char *d=dest;
char *s=src[len];
while(len--!=0)
d++=s--;
printf("%s",dest);
}
找出错误!!
#include "string.h"
#include "stdio.h"
#include "malloc.h"
main(void)
{
char *src="hello,world";
char *dest=NULL;
dest=(char *)malloc(sizeof(char)*(strlen(src)+1));
int len=strlen(src);
char *d=dest;
char *s=src+len-1;
while(len--!=0)
*d++=*s--;
*d='\0';
printf("%s",dest);
}
1. 简述一个 Linux 驱动程序的主要流程与功能。
2. 请列举一个软件中时间换空间或者空间换时间的例子。
void swap(int a,int b)
{
int c; c=a;a=b;b=a;
}
--->空优
void swap(int a,int b){
a=a+b;b=a-b;a=a-b;
}
6. 请问一下程序将输出什么结果?
char *RetMenory(void)
{
char p[] = “hellow world”;
return p;
}
void Test(void)
{
char *str = NULL;
str = RetMemory();
printf(str);
}
RetMenory 执行完毕,p 资源被回收,指向未知地址。返回地址,str 的内容应是不可预测的,
打印的应该是 str 的地址
写一个函数,它的原形是 int continumax(char *outputstr,char *intputstr)
功能:
在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中
一个函数参数 outputstr 所指内存。例如:"abcd12345ed125ss123456789"的首地址传给
intputstr 后,函数将返回
9,outputstr 所指的值为 123456789
int continumax(char *outputstr, char *inputstr)
{
char *in = inputstr, *out = outputstr, *temp, *final;
int count = 0, maxlen = 0;
while( *in != '\0' )
{
if( *in > 47 && *in < 58 )
{
for(temp = in; *in > 47 && *in < 58 ; in++ )
count++;
}
else
in++;
if( maxlen < count )
{
maxlen = count;
count = 0;final = temp;
}
}
for(int i = 0; i < maxlen; i++)
{
*out = *final;
out++;
final++;
}
*out = '\0';
return maxlen;
}
不用库函数,用 C 语言实现将一整型数字转化为字符串
方法 1:
int getlen(char *s){
int n;
for(n = 0; *s != '\0'; s++)
n++;
return n;
}
void reverse(char s[])
{
int c,i,j;
for(i = 0,j = getlen(s) - 1; i < j; i++,j--){
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
void itoa(int n,char s[])
{
int i,sign;
if((sign = n) < 0)
n = -n;
i = 0;
do{/*以反序生成数字*/
s[i++] = n%10 + '0';/*get next number*/
}while((n /= 10) > 0);/*delete the number*/
if(sign < 0)
s[i++] = '-';
s[i] = '\0';reverse(s);
}
方法 2:
#include
using namespace std;
void itochar(int num);
void itochar(int num)
{
int i = 0;
int j ;
char stra[10];
char strb[10];
while ( num )
{
stra[i++]=num%10+48;
num=num/10;
}
stra[i] = '\0';
for( j=0; j < i; j++)
{
strb[j] = stra[i-j-1];
}
strb[j] = '\0';
cout< } int main() { int num; cin>>num; itochar(num); return 0; } 前几天面试,有一题想不明白,请教大家! typedef struct { int a:2; int b:2; int c:1; }test;test t; t.a = 1; t.b = 3; t.c = 1; printf("%d",t.a); printf("%d",t.b); printf("%d",t.c); 谢谢! t.a 为 01,输出就是 1 t.b 为 11,输出就是-1 t.c 为 1,输出也是-1 3 个都是有符号数 int 嘛。 这是位扩展问题 01 11 1 编译器进行符号扩展 求组合数: 求 n 个数(1....n)中 k 个数的组合.... 如:combination(5,3) 要求输出:543,542,541,532,531,521,432,431,421,321, #include int pop(int *); int push(int ); void combination(int ,int ); int stack[3]={0}; top=-1; int main() { int n,m; printf("Input two numbers:\n"); while( (2!=scanf("%d%*c%d",&n,&m)) ) { fflush(stdin); printf("Input error! Again:\n"); } combination(n,m); printf("\n");} void combination(int m,int n) { int temp=m; push(temp); while(1) { if(1==temp) { if(pop(&temp)&&stack[0]==n) //当栈底元素弹出&&为可能取的最小值,循环退出 break; } else if( push(--temp)) { printf("%d%d%d ",stack[0],stack[1],stack[2]);//§ä¨ì¤@? pop(&temp); } } } int push(int i) { stack[++top]=i; if(top<2) return 0; else return 1; } int pop(int *i) { *i=stack[top--]; if(top>=0) return 0; else return 1; } 1、用指针的方法,将字符串“ABCD1234efgh”前后对调显示 #include #include #include int main() { char str[] = "ABCD1234efgh"; int length = strlen(str);char * p1 = str; char * p2 = str + length - 1; while(p1 < p2) { char c = *p1; *p1 = *p2; *p2 = c; ++p1; --p2; } printf("str now is %s\n",str); system("pause"); return 0; } 2、有一分数序列:1/2,1/4,1/6,1/8……,用函数调用的方法,求此数列前 20 项的和 #include double getValue() { double result = 0; int i = 2; while(i < 42) { result += 1.0 / i;//一定要使用 1.0 做除数,不能用 1,否则结果将自动转化成整数, 即 0.000000 i += 2; } return result; } int main() { printf("result is %f\n", getValue()); system("pause"); return 0; } ]]>
有一个数组 a[1000]存放 0--1000;要求每隔二个数删掉一个数,到末尾时循环至开头继续进 行,求最后一个被删掉的数的原始下标位置。 以 7 个数为例: {0,1,2,3,4,5,6,7} 0-->1-->2(删除)-->3-->4-->5(删除)-->6-->7-->0(删除),如此循环直到最 后一个数被删除。 方法 1:数组 #include using namespace std; #define null 1000 int main() { int arr[1000]; for (int i=0;i<1000;++i) arr[i]=i; int j=0; int count=0; while(count<999) { while(arr[j%1000]==null) j=(++j)%1000; j=(++j)%1000; while(arr[j%1000]==null) j=(++j)%1000; j=(++j)%1000; while(arr[j%1000]==null) j=(++j)%1000; arr[j]=null; ++count; } while(arr[j]==null) j=(++j)%1000; cout< return 0; }方法 2:链表 #include #define null 0 struct node { int data; node* next; }; int main() { node* head=new node; head->data=0; head->next=null; node* p=head; for(int i=1;i<1000;i++) { node* tmp=new node; tmp->data=i; tmp->next=null; head->next=tmp; head=head->next; } head->next=p; while(p!=p->next) { p->next->next=p->next->next->next; p=p->next->next; } cout< return 0; } 方法 3:通用算法 #include #define MAXLINE 1000 //元素个数 /* MAXLINE 元素个数 a[] 元素数组 R[] 指针场 suffix 下标 index 返回最后的下标序号 values 返回最后的下标对应的值 start 从第几个开始 K 间隔 */ int find_n(int a[],int R[],int K,int& index,int& values,int s=0) {int suffix; int front_node,current_node; suffix=0; if(s==0) { current_node=0; front_node=MAXLINE-1; } else { current_node=s; front_node=s-1; } while(R[front_node]!=front_node) { printf("%d\n",a[current_node]); R[front_node]=R[current_node]; if(K==1) { current_node=R[front_node]; continue; } for(int i=0;i front_node=R[front_node]; } current_node=R[front_node]; } index=front_node; values=a[front_node]; return 0; } int main(void) { int a[MAXLINE],R[MAXLINE],suffix,index,values,start,i,K; suffix=index=values=start=0; K=2; for(i=0;i a[i]=i; R[i]=i+1; } R[i-1]=0; find_n(a,R,K,index,values,2); printf("the value is %d,%d\n",index,values); return 0; } 试题:void test2() { char string[10], str1[10]; int i; for(i=0; i<10; i++) { str1[i] = 'a'; } strcpy( string, str1 ); } 解答:对试题 2,如果面试者指出字符数组 str1 不能在数组内结束可以给 3 分;如果面试者 指出 strcpy(string, str1)调用使得从 str1 内存起复制到 string 内存起所复制的字节数具有不确 定性可以给 7 分,在此基础上指出库函数 strcpy 工作方式的给 10 分; str1 不能在数组内结束:因为 str1 的存储为:{a,a,a,a,a,a,a,a,a,a},没有'\0'(字符串结束符),所以 不能结束 strcpy( char *s1,char *s2)他的工作原理是,扫描 s2 指向的内存,逐个字符付到 s1 所指向的 内存,直到碰到'\0',因为 str1 结尾没有'\0',所以具有不确定性,不知道他后面还会付什么东 东。 正确应如下 void test2() { char string[10], str1[10]; int i; for(i=0; i<9; i++) { str1[i] = 'a'+i; //把 abcdefghi 赋值给字符数组 } str[i]='\0';//加上结束符 strcpy( string, str1 ); } 第二个 code 题是实现 strcmp int StrCmp(const char *str1, const char *str2) 做是做对了,没有抄搞,比较乱 int StrCmp(const char *str1, const char *str2) { assert(str1 && srt2); while (*str1 && *str2 && *str1 == *str2) { str1++, str2++; } if (*str1 && *str2) return (*str1-*str2); elseif (*str1 && *str2==0) return 1;elseif (*str1 = = 0 && *str2) return -1; else return 0; } int StrCmp(const char *str1, const char *str2) { //省略判断空指针(自己保证) while(*str1 && *str1++ = = *str2++); return *str1-*str2; } 第三个 code 题是实现子串定位 int FindSubStr(const char *MainStr, const char *SubStr) 做是做对了,没有抄搞,比较乱 int MyStrstr(const char* MainStr, const char* SubStr) { const char *p; const char *q; const char * u = MainStr; //assert((MainStr!=NULL)&&( SubStr!=NULL));//用断言对输入进行判断 while(*MainStr) //内部进行递增 { p = MainStr; q = SubStr; while(*q && *p && *p++ == *q++); if(!*q ) { return MainStr - u +1 ;//MainStr 指向当前起始位,u 指向 } MainStr ++; } return -1; } 分析: int arr[] = {6,7,8,9,10}; int *ptr = arr; *(ptr++)+=123; printf(“ %d %d ”, *ptr, *(++ptr)); 输出:8 8 过程:对于*(ptr++)+=123;先做加法 6+123,然后++,指针指向 7;对于 printf ( “ %d %d ” , *ptr, *(++ptr));从后往前执行,指针先++,指向 8,然后输出 8,紧接着再输出 8华为全套完整试题