2021-08-18

姓名:朱军伟               学号: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

【嵌牛导读】任何行业的终极目标都是为了谋求发展,嵌入式作为一个前沿行业,我们有必要熟悉一下常见的面试题,我将此作为一个系列发布。

【嵌牛鼻子】嵌入式行业面试题

【嵌牛提问】如何轻松应对嵌入式行业面试?

【嵌牛正文】

写一段程序,找出数组中第 k 大小的数,输出数所在的位置。例如{2,4,3,4,7}中,第

一大的数是 7,位置在 4。第二大、第三大的数都是 4,位置在 1、3 随便输出哪一个均可。

函数接口为:int find_orderk(const int* narry,const int n,const int k)

要求算法复杂度不能是 O(n^2)

谢谢!

可以先用快速排序进行排序,其中用另外一个进行地址查找

代码如下,在 VC++6.0 运行通过。给分吧^-^

//快速排序

#include

usingnamespacestd;

intPartition (int*L,intlow,int high)

{

inttemp = L[low];

intpt = L[low];

while (low < high)

{

while (low < high && L[high] >= pt)

--high;

L[low] = L[high];

while (low < high && L[low] <= pt)

++low;

L[low] = temp;

}

L[low] = temp;

returnlow;

}

voidQSort (int*L,intlow,int high)

{

if (low < high)

{

intpl = Partition (L,low,high);

QSort (L,low,pl - 1);QSort (L,pl + 1,high);

}

}

intmain ()

{

intnarry[100],addr[100];

intsum = 1,t;

cout << "Input number:" << endl;

cin >> t;

while (t != -1)

{

narry[sum] = t;

addr[sum - 1] = t;

sum++;

cin >> t;

}

sum -= 1;

QSort (narry,1,sum);

for (int i = 1; i <= sum;i++)

cout << narry[i] << '\t';

cout << endl;

intk;

cout << "Please input place you want:" << endl;

cin >> k;

intaa = 1;

intkk = 0;

for (;;)

{

if (aa == k)

break;

if (narry[kk] != narry[kk + 1])

{

aa += 1;

kk++;

}}

cout << "The NO." << k << "number is:" << narry[sum - kk] << endl;

cout << "And it's place is:" ;

for (i = 0;i < sum;i++)

{

if (addr[i] == narry[sum - kk])

cout << i << '\t';

}

return0;

}

1、找错

Void test1()

{

char string[10];

char* str1="0123456789";

strcpy(string, str1);// 溢出,应该包括一个存放'\0'的字符 string[11]

}

Void test2()

{

char string[10], str1[10];

for(I=0; I<10;I++)

{

str1[i] ='a';

}

strcpy(string, str1);// I,i 没有声明。

}

Void test3(char* str1)

{

char string[10];

if(strlen(str1)<=10)// 改成<10,字符溢出,将 strlen 改为 sizeof 也可以

{

strcpy(string, str1);

}

}

2.

void g(int**);int main()

{

int line[10],i;

int *p=line; //p 是地址的地址

for (i=0;i<10;i++)

{

*p=i;

g(&p);//数组对应的值加 1

}

for(i=0;i<10;i++)

printf("%d\n",line[i]);

return 0;

}

void g(int**p)

{

(**p)++;

(*p)++;// 无效

}

输出:

1

2

3

4

5

6

7

8

9

10

3. 写出程序运行结果

int sum(int a)

{

auto int c=0;

static int b=3;

c+=1;

b+=2;

return(a+b+c);

}

void main()

{

int I;int a=2;

for(I=0;I<5;I++)

{

printf("%d,", sum(a));

}

}

// static 会保存上次结果,记住这一点,剩下的自己写

输出:8,10,12,14,16,

4.

int func(int a)

{

int b;

switch(a)

{

case 1: 30;

case 2: 20;

case 3: 16;

default: 0

}

return b;

}

则 func(1)=?

// b 定义后就没有赋值。

5:

int a[3];

a[0]=0; a[1]=1; a[2]=2;

int *p, *q;

p=a;

q=&a[2];

则 a[q-p]=a[2]

解释:指针一次移动一个 int 但计数为 1

今天早上的面试题 9 道,比较难,向牛人请教,国内的一牛公司,坐落在北京北四环某大厦:

1、线形表 a、b 为两个有序升序的线形表,编写一程序,使两个有序线形表合并成一个有序

升序线形表 h;

答案在 请化大学 严锐敏《数据结构第二版》第二章例题,数据结构当中,这个叫做:两路

归并排序

Linklist *unio(Linklist *p,Linklist *q){

linklist *R,*pa,*qa,*ra;

pa=p;qa=q;

R=ra=p;

while(pa->next!=NULL&&qa->next!=NULL){

if(pa->data>qa->data){

ra->next=qa;

qa=qa->next;

}

else{

ra->next=pa;

pa=pa->next;

}

}

if(pa->next!=NULL)

ra->next=pa;

if(qa->next!=NULL)

ra->next==qa;

return R;

}

2、运用四色定理,为 N 个局域举行配色,颜色为 1、2、3、4 四种,另有数组 adj[][N],如

adj[i][j]=1 则表示 i 区域与 j 区域相邻,数组 color[N],如 color[i]=1,表示 i 区域的颜色为 1 号

颜色。

四色填充

3、用递归算法判断数组 a[N]是否为一个递增数组。

递归的方法,记录当前最大的,并且判断当前的是否比这个还大,大则继续,否则返回 false

结束:

bool fun( int a[], int n )

{

if( n= =1 )

return true;

if( n= =2 )

return a[n-1] >= a[n-2];

return fun( a,n-1) && ( a[n-1] >= a[n-2] );

}

4、编写算法,从 10 亿个浮点数当中,选出其中最大的 10000 个。

用外部排序,在《数据结构》书上有

《计算方法导论》在找到第 n 大的数的算法上加工

5、编写一 unix 程序,防止僵尸进程的出现.

你可能感兴趣的:(2021-08-18)