小米嵌入式軟件工程師筆試題目解析


哈嘍,大家好。我又來分享筆試題目了。今天分享的是小米的嵌入式軟件開發工程師的筆試題目。這份題目很奇怪,操作系統,數據結構,網絡基礎,Java,C++,數據庫,正則表達式,Linux都考到了。當時做題的時候,我都懷疑發錯卷子了。。。還好最后兩道大題都做了出來,否則,筆試很容易就掛了。面試這個公司的時候,一共面了兩輪技術面,一輪HR面。最后也收獲了Offer。但是,已經是十月中旬,手上沒有三方協議了,很可惜,錯過了。面經可以參考下這篇文章2020秋招聯發科小米等面經分享

本文已同步更新在github,點擊跳轉。希望大家能給個star支持下!

@

選擇題

1.已經獲得除CPU以外的所有所需資源的進程處於()狀態

A 就緒狀態

B 阻塞狀態

C 運行狀態

D 活動狀態

A

進程的五狀態模型:

運行態:該進程正在執行。

就緒態:進程已經做好了准備,只要有機會就開始執行。

阻塞態(等待態):進程在某些事情發生前不能執行,等待阻塞進程的事件完成。

新建態:剛剛創建的進程,操作系統還沒有把它加入到可執行進程組中,通常是進程控制塊已經創建但是還沒有加載到內存中的進程。

退出態:操作系統從可執行進程組中釋放出的進程,或由於自身或某種原因停止運行。

2.某二叉樹的中序遍歷序列為32145,后序遍歷序列為32145,則前序遍歷序列為

A 54123

B 32154

C 32541

D 54321

A

二叉樹的中序遍歷序列為 32145 ,后序遍歷序列為32145 ,可知該樹只有左子樹結點,沒有右子樹結點, 5 為根結點。

中序遍歷序列與后序遍歷序列相同,說明該樹只有左子樹沒有右子樹,因此該樹有 5 層,從頂向下依次為54123 。

具體分析過程也可以參考下北京聯發科嵌入式軟件工程師筆試題目解析

3.若已知一個棧的入棧順序是1,2,3...,n,其輸出序列為P1,P2,P3,....Pn,若P1是n,則Pi=()?

A i

B n-i+1

C 不確定

D n-i

B

棧的排列遵循先進后(即后進先出)出的原則

因為P1是n,是出棧的第一個數字,說明在n之前進棧的數字都沒有出棧。所以這個順序是確定的。

還可以知道,最后出棧的一定是數字1,也就是Pn。代入這個式子,是正確的。

4(多選題).下面協議中屬於應用層協議的是()

A ICMP、ARP

B FTP、 TELNET

C HTTP、SNMP

D SMTP、POP3

BCD

1、物理層:以太網 、 調制解調器 、 電力線通信(PLC) 、SONET/SDH 、 G.709 、 光導纖維 、 同軸電纜、 雙絞線等。

2、數據鏈路層:Wi-Fi(IEEE 802.11)、WiMAX(IEEE 802.16) 、ATM 、 DTM 、 令牌環 、以太網、FDDI、 幀中繼、 GPRS 、 EVDO、HSPA 、HDLC 、 PPP 、 L2TP 、PPTP 、ISDN·STP、CSMA/CD等。

3、網絡層協議:IP IPv4 、IPv6、 ICMP、ICMPv6·IGMP、IS-IS 、IPsec 、ARP 、RARP 、RIP等。

4、傳輸層協議:TCP、 UDP、TLS 、 DCCP、 SCTP 、 RSVP 、OSPF 等。

5、應用層協議:DHCP 、DNS、 FTP 、Gopher 、 HTTP、 IMAP4 、 IRC、 NNTP 、 XMPP、POP3 、SIP、 SMTP、SNMP 、SSH、TELNET 、 RPC 、RTCP 、RTP 、RTSP、SDP 、 SOAP、GTP、STUN 、NTP、SSDP 、 BGP 等。

5.下列程序段的時間復雜度是()

int fact(int n){
	if(n<=1){
		return 1;
	}
	return n*fact(n-1);
}

A O(log2n)

B O(nlog2n)

C O(n)

D O(n*n)

C

當n<=1時執行return 1這一個語句,每次返回上一層都執行n*fact(n-1)這一個語句,共執行n-1次。因此共執行基本語句n次,時間復雜度為O(n)

6.下列排序算法中最好情況和最壞情況的時間復雜度相同的是?()

A 堆排序

B 快速排序

C 冒泡排序

D 歸並排序

A C D

堆排序在最好和最壞情況下的時間復雜度均為O(nlogn)

快速排序最好和最壞情況下的時間復雜度分別為O(nlogn)和O(n^2 )

冒泡排序排序在最好和最壞情況下的時間復雜度均為O(nlogn)

歸並排序在最好和最壞情況下的時間復雜度均為O(nlogn)

7.將兩個各有n個元素的有序表歸並成一個有序表,最少的比較次數是?()

A n

B 2n

C n-1

D 2n-1

A

歸並排序是將兩個或兩個以上的有序子表合並成一個新的有序表。在歸並排序中,核心步驟是將相鄰的兩個有序序列歸並為一個有序序列。

題目中告訴我們,有兩個各有n個元素的有序序列,要將這兩個序列歸並成一個有序序列,其方法是依次從小到大取每個序列中的元素進行比較,將較小的放進一個新的序列中,直到取完一個有序序列中的所有元素。再把另一個序列中剩下的元素放進新序列的后面即可。

最好的情況是一個有序序列中的最小元素大於另一個有序序列中的所有元素,這樣只需要比較n次。

8.將遞歸算法轉換為非遞歸算法通常需要使用()

A 棧

B 隊列

C 隊列

D 廣義表

D

9.在MySql中, productname regexp '[1-3]xiaomi'的含義是()

A productname 匹配“xiaomi重復1次或5次”的字符串

B productname 匹配“xiaomi字符串前一個字符為1或3“的字符串

C productname 匹配“xiaomi重復1到3次”的字符串

D productname 匹配“xiaomi字符串前一個字符為1到3“的字符串

D

10.同個進程的不同線程以下不能被共享的是?()

A 全局變量

B 堆

C 文件句柄

D 棧

D

線程共享的進程環境包括:

進程代碼段、進程的公有資源(如全局變量,利用這些共享的數據,線程很容易的實現相互之間的通信)、進程打開的文件描述符、消息隊列、信號的處理器、進程的當前目錄、進程用戶ID、進程組ID

線程獨占資源:

線程ID、寄存器組的值、用戶棧、內核棧(在一個進程的線程共享堆區(heap))、錯誤返回碼、線程的信號屏蔽碼、線程的優先級

專項選擇題

1.下列Java函數的執行結果是什么()

static boolean foo(charc)
{
	System.out.print(c);
    return true;
}
public static void main(string[] args){
    int i = 0;
    for(foo('B');foo('A')&&(i<2);foo('C'))
    {
		i++;
        foo('D');
    }
}

A BADCBDCB

B BACDBACD

C BADCADCA

D 運行時拋出異常

C

1.其實foo('B');就是初始化條件,只會執行一次,所以第一個打印的肯定是B。

2.因為i=0;循環條件是i<2 (由此可知,循環i等於2的時候就會停止循環),所以0<2滿足條件,接着會輸出A。然后執行i++;i就變成1了,在輸出D
,在最后輸出C。一次循環后的結果是:BADC。

3.第二次循環的開始是foo('B');是初始條件,所以不會執行。直接從foo('A')開始,輸出A,然后i為1,且小於2,此時循環體內再次執行i++;i的值為2了,再次輸出D,最后輸出C。第二次循環輸出:ADC。

4.然后循環再次執行for(foo('B');foo('A')&&(i<2);foo('C')),直接輸出A。i的值在第二輪循環后的值變成了2,2<2不成立,終止循環,輸出A。

故輸出結果是:BADCADCA。

2.下列有關軟鏈接表述正確的是?()

A 不可以對不存在的文件創建軟鏈接

B 不能對目錄創建軟鏈接

C 和普通件沒有什么不同,inode都指向同一個文件在硬量中的區塊

D 保存了其代表的文件的絕對路徑是另一種文件。在硬盤上有獨立的區塊,訪問時替代自身路徑

C

A:錯。后半句說的是硬鏈接。硬鏈接是共同擁有同一個inode,不過是每個鏈接名不同,暫時理解成不同的文件名卻指向同一文件。一個文件每加一個硬鏈接linkcount加1。

B:錯。可以對目錄創建軟鏈接。如下圖所示。

D:錯。可以對不存在的文件創建軟鏈接,如下圖所示。

3.選項中那一行代碼可以替換//add code here 而不產生編譯錯誤()

public abstruct class MyClass{
    publicint testInt = 5;
    //addcode here
    publicvoid method(){  
    }
}

A public abstruct void another Method(){}

B testInt = testInt * 5

C public int method();

D public abstruct void another Method(int a)

D

A:該項方法有abstract修飾,所以是抽象方法,由於抽象方法不能有方法體,所以A項錯誤

B:類體中只能定義變量和方法,不能有其他語句,所以B項錯誤

C:選項中的方法和類中的方法重復,所以會發生編譯異常,所以C項錯誤

4.有關Java靜態初始化塊說法不正確的是?()

A 用戶可以控制何時執行靜態初始化塊

B 無法直接詞用靜態初始化塊

C 在創建第一個實例前,將自動調用靜態初始化塊來初始化

D 靜態初始化塊沒有訪問修飾符和參數

A

JAVA的初始化順序:

父類的靜態成員初始化>父類的靜態代碼塊>子類的靜態成員初始化>子類的靜態代碼塊>父類的代碼塊>父類的構造方法>子類的代碼塊>子類的構造方法

5(多選題)以下分別對變量a給出定義,正確的有()

A 一個有10個指針的數組,該指針指向同一個整型數:int *a[10];

B 一個指向10個整型數組的指針:int ( *a)[10];

C 一個指向函數的指針,該函數有一個整型數並返回一個整型數:int *a(int);

D 一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數並返回一個整型數:int ( *a[10])(int);

ABD

C改為:int (*a)(int)

指針數組:首先是一個數組,數組里面的元素都是指針;(存儲指針的數組)

數組指針:首先是一個指針,指針指向一個一維數組;(指向數組的指針)

函數指針:一定要理解,回調中經常使用函數指針;

指針函數:就是一個普通函數,只是返回值是指針形式;

6(多選題)下列敘述正確的是()

A 指針可以為空,引用不能為空。

B 不存在指向空值的引用,但是存在指向空值的指針

C 引用必須被初始化,但是指針不必

D 指針初化后不能被改變,引用可以改變所指對象

ABC

D:引用初始化以后不能被改變,指針可以改變所指的對象

7.下列關於C++容器描述錯誤的是?()

A list類型支持雙向順序訪問,在list中任何位置插入刪除都很快

B deque類型支持快速順序訪間,在頭尾插入/刪除速度很快

C C++標准庫map的底層實現為紅黑樹

D vector類型在每次調用 pushback時都在棧上開辟新內存

B

deque:雙端隊列。支持快速隨機訪問。在頭尾位置插入/刪除速度很快。

8(多選題)C++中,下列數據類型的轉換,哪個可能會發生信息丟失?

A int -> double

B int -> long

C long -> float

D int -> char

CD

精度丟失只會發生在從大范圍到小范圍的轉換

32位編譯器:

char short int long float double 指針

1 2 4 4 4 8 4

64位編譯器:

char short int long float double 指針

1 2 4 8 4 8 8

9.在Java中,要使某個類能被同一個包中的其他類訪問,但不能被這個包以外的類訪問,可以()

A 使用 private關鍵字

B 讓該類不使用任何關鍵字

C 使用public關鍵字

D 使用protected關鍵字

B

default和protected的區別是:

前者只要是外部包,就不允許訪問。

后者只要是子類就允許訪問,即使子類位於外部包。

總結:default拒絕一切包外訪問;protected接受包外的子類訪問

10(多選題)list和vector的區別有哪些()

A vector擁有一段連續的內存空間,因此支持隨機存取,如果需要高效的隨即存取,而不在乎插入和刪除的效率,使用 vector.

B list擁有一段不連續的內存空間,因此支持隨機存取,如果需要大量的插入和刪除,而不關心隨即存取,則應使用list

C 已知需要存儲的元素時,使用list較好

D 如果需要任意位置插入元素,使用 vector較好

AB

C:已知需要存儲的元素時,vector要好

D:如果需要任意位置插入元素,list要好

編程題1(字符串篩選)

給定一個字符串,需要去除所有之前曾經出現過的字符,只保留第一次出現的字符。

樣例輸入:hello,welcome to xiaomi

樣例輸出:helo,wcmtxia

 思路

  1. 首先需要定義兩個數組,分別為“輸入的字符串數組”old[ ] 以及 “輸出的字符串數組” new[ ];

  2. 取old數組中的第一個字符去和new數組中的每一個字符串相比較是否相同,若出現相同,則取old數組的下一個字符再次與new中每一個字符相比較,若都不相同則存入new的數組中;

  3. 最后輸出數組new;

代碼

#include <stdio.h>
void killsame(char *o, char *n)
{
  int i=0, j, k=0;
  int label;
  
  while(o[i] != '\0')
  {
  	label = 1;
  	for(j=0; j<i; j++)
  	{
  		if (o[i] == n[j])
  			label = 0;  //一旦相同標志位置0
  	}
  	if(label)  // 不相等
  		n[k++]=o[i];
  	i++;
  }	
  n[k]='\0';  //結尾給\0
  puts(n);  //輸出
}

int main(void)
{
  printf("Please input a string you want:\n");
  char old[126]; 
  char new[126];
  scanf("%s",old);
  killsame(old, new);//去重
  return 0;
}

編程題2(字符串有效判斷)

給定一個只包括''(',')’,'{','}','[',']'的字符串,判斷字符串是否有效

有效字符串需滿足:

1.左括號必須使用相同類型的右括號閉合

2.左括號必須以正確的順序閉合

注意空字符串可被認為是有效字符串

輸入描述:待判斷的字符串,多個字符串需換行輸入

輸出描述:每個字符串的判斷結果,多個結果需換行輸出

樣例輸入:

() [] {}

([)]

{[]}

樣例輸出:

true

false

true

思路

棧先入后出特點恰好與本題括號排序特點一致,所以用棧來實現。

當左括號出現的時候入棧,當右括號出現的出棧,如果匹配就繼續,不匹配就錯誤。

當字符串遍歷完成之后,棧內仍有字符串就錯誤。

用一個數組進行和一個記錄棧頂值的int進行了棧的模擬,代碼很簡單,很好理解。

代碼

#include <stdiio.h>
bool isValid(char * s){
   
    int len = strlen(s);
    char stack[3500];
    int top = -1;
    int i = 0;
    for( i=0;i<len;i++)
    {
      if((s[i] == '(')||(s[i] == '{')||(s[i] == '['))
        stack[++top] = s[i];
      else
        {
               if(top<0)//出現了右括號,但數組為空,即沒有左括號與之匹配
                return false;
                if((s[i] == ')'))
                {
                     if(stack[top]!='(') return false;
                     else top--;
                }

             if((s[i] == '}'))  
             {
              if(stack[top]!='{') return false;
               else top--;
             }
        
            if((s[i] == ']'))  
            {
              if(stack[top]!='[') return false;  
              else top--;
            }

        }   
    }
    if(top>=0) //數組內仍有左括號,沒有右括號與之匹配
        return false;\
        //這里一定要有返回值
         return true;
}
int main(void)
{
	printf("Please enter a bunch of brackets:\n");
	char brackets[100]; 
	scanf("%s",brackets);
	printf(isValid(brackets));  
    return 0;
}

今天的題目就分享到這里,下一篇文章,將會分享大廠的筆試題目解析。

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/qq_16933601/article/details/115752525


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM