2020.08.10
單選18道(54分),多選4道(16分),問答3道(30分)。
單選基本都是牛客網原題,python知識居多,問答題包括1道C++相關,1道python相關,1道程式設計題。
突然發現選擇題在百度文庫都能找到,害
下集更新「常見python筆試題」~
一、單選
- 進程間通訊方式中哪種存取速度最快?
管道
訊息佇列
共用記憶體
通訊端
知識點:進程間通訊方式
進程通訊的概念:進程使用者空間是相互獨立的,一般而言是不能相互存取的。但很多情況下進程間需要互相通訊,來完成系統的某項功能。進程通過與內核及其它進程之間的互相通訊來協調它們的行爲。
- 管道:速度慢,容量有限
- 訊息佇列:容量受到系統限制,且要注意第一次讀的時候,要考慮上一次沒有讀完數據的問題。
- 號志:不能傳遞複雜訊息,只能用來同步
- 共用記憶體區:使多個進程同時存取同一記憶體。能夠很容易控制容量,速度快,但要保持同步,比如一個進程在寫的時候,另一個進程要注意讀寫的問題,相當於執行緒中的執行緒安全,當然,共用記憶體區同樣可以用作執行緒間通訊,不過沒這個必要,執行緒間本來就已經共用了一塊記憶體的。
- Linux下,爲某個指令碼賦予可執行許可權
chmod +x filename.sh
chown +x filename.sh
chmod +r filename.sh
chown +r filename.sh
知識點:Linux的基本操作
- chmod:利用 chmod 可以控制檔案如何被他人所呼叫,x是可執行;
- r:讀;w:寫;x:執行
- chown:利用 chmod 可以控制檔案如何被他人所呼叫。
- 32位元環境下,
int *p=new int[10]
,請問sizeof(p)
的值爲:
4
10
40
8
知識點:指針操作
int *p=new int;
——分配一個int型變數所佔大小的空間,並將首地址賦給int *型指針p。
int *p=new int[10];
——分配一個有10個int型元素的陣列所佔空間,並將該陣列的第一個元素的地址賦給int *型指針p。
int *p=new int(10);
——分配一個int型變數所佔大小的空間,在其中放入十進制數10,並將首地址賦給int *型指針p。
- 語句char str[] = 「abcde」;請問表達式sizeof(str)的值是
1
4
5
6
知識點:字串的表達
- 字元陣列的最後一位爲
'\0'
,也要計算到字串的長度中;
- char型別的數據佔1位元組,sizeof()是計算陣列中數據所佔記憶體大小。
- 若進棧序列爲a、b、c、d,進棧過程中可以出棧,那麼()是不可能的出棧序列
cbad
bdca
adbc
cdba
知識點:棧的基礎知識
來源:牛客網
A 進棧序列爲 a,b,c 進棧,c,b,a出棧,最後d進棧,d出棧
B 進棧序列爲 a,b進棧,b出棧,c,d進棧,d,c出棧,最後a出棧
C 不可能 a進棧,a出棧,bcd進棧,d出棧,之後只能是c先出棧,然後b出棧
D 進棧序列爲 a,b,c進棧,c出棧,d進棧,d出棧,b,a出棧
- 下列那個語句在python中是非法的?
x = y = z = 1
x = (y = z + 1)
x, y = y, x
x += y
知識點:python的基本操作
- 在python中,等號右邊不能是賦值語句。
- 其中x=y=z=1是多重賦值;
- x, y = y, x是多元賦值;
- x += y是增量賦值
- 關於python記憶體管理,下列說法錯誤的是
變數不必事先宣告
變數無須先建立和賦值而直接使用
變數無須指定型別
可以使用del釋放資源
知識點:python的記憶體管理
- 變數不必事先說明;
- 變數無需指定型別,因爲在python中會自動根據賦值語句來決定型別;
- 可以使用del釋放資源;
- 但變數在使用前必須賦值,在賦值的同時變數也就建立了
- 下面 下麪哪個不是python的合法識別符號
int32
40XL
self
name
知識點:python的識別符號
- 在python中,所有識別符號可以包括英文、數位以及下劃線,但python中的識別符號不能以數位開頭
- python中的識別符號是區分大小寫的
- python中以下劃線開頭的識別符號是有特殊意義的:
以單下劃線開頭表示不能直接存取的類屬性,需通過類提供的介面進行存取;
雙下劃線開頭的代表類的私有成員 ,可以讓類內部屬性不被外部存取;
以雙下劃線開頭和結尾的代表python裡特殊方法專用的標識,比如 init() 就代表類別建構函式,在每次建立物件時會自動呼叫。
- python不支援的數據型別有
char
int
float
list
知識點:python的數據型別
- python中的五個標準的數據型別:
數位
字串string
列表list
元組tuple
字典dict
- python支援的四種不同的數位型別:
整數int、長整數long、
浮點數float、
複數complex
- 字元也是用字串來表示的
- 關於python的字串下列說法錯誤的是:
字元應該視爲長度爲1的字串
字串以\0標誌字串的結束
既可以用單引號,也可以用雙引號建立字串
在三引號字串中可以包含換行回車等特殊字元
知識點:python的字串型別
- python中沒有規定字串必須以\0結束;
- python裡字元應該視爲長度爲1的字串;
- 字串型別的數據即可以用單引號也可以用雙引號建立;
- 在三引號中的內容通常爲所定義函數的說明文字;
- 以下不能建立一個字典的語句是
dict1 = {}
dict2 = { 3 : 5 }
dict3 = {[1,2,3]: 「uestc」}
dict4 = {(1,2,3): 「uestc」}
知識點:python建立字典的方法與注意事項
- 字典的key必須是不可變物件,比如list就不能叫做key;
- 元組的話是不可變的,所以可以建立字典呦。
- python源程式執行的方式
編譯執行
解析執行
直接執行
邊編譯邊執行
- 編譯執行:原始碼經過編譯器便已處理,生成目標機器碼,就是機器能直接執行的程式碼,下次執行時無需重新編譯;
- 直譯語言:是在程式碼執行期間逐行翻譯成目標機器碼,下次執行時,還是需要逐行解釋,我們可以簡單認爲java、python都是直譯語言;
- 效率上通常來說直譯語言比不過編譯型語言。
- python並不是嚴格的直譯語言,在python程式碼執行之前,會先編譯成中間程式碼,每個 .py 檔案將被換轉成 .pyc 檔案,.pyc 就是一種位元組碼檔案,它是與平臺無關的中間程式碼,不管你放在 Windows 還是 Linux 平臺都可以執行,執行時將由虛擬機器逐行把位元組碼翻譯成目的碼。
我們安裝Python 時候,會有一個 Python.exe 檔案,它就是 Python 直譯器,你寫的每一行 Python 程式碼都是由它負責執行,直譯器由一個編譯器和一個虛擬機器構成,編譯器負責將原始碼轉換成位元組碼檔案,而虛擬機器負責執行位元組碼,所以,直譯語言其實也有編譯過程,只不過這個編譯過程並不是直接生成目的碼,而是中間程式碼(位元組碼),然後再通過虛擬機器來逐行解釋執行位元組碼。
- 以下是python字元轉換成位元組的方法是
decode()
encode()
upper()
rstrip()
知識點:python字串與位元組之間的轉換
- decode字串解碼,將字串解碼成unicode編碼,就是把二進制數據轉化成人能看懂的英文或漢字;
- encode將unicode編碼的字串編碼成二進制數據。
- python字串轉換成位元組的三種方式:
str=‘zifuchuan’
第一種 b’zifuchuan’
第二種bytes(‘zifuchuan’,encoding=‘utf-8’)
第三種(‘zifuchuan’).encode(‘utf-8’)
- 關於python模組說法錯誤的是
A. 一個.py就是一個模組
B. 任何一個普通的xx.py檔案可以作爲模組匯入
C. 模組檔案的擴充套件名一定是 .py
D. 執行時會從指定的目錄搜尋匯入的模組,如果沒有,會報錯異常
知識點:python模組的理解
- Python 模組(Module),是一個 Python 檔案,以 .py 結尾,包含了 Python 物件定義和Python語句。
模組讓你能夠有邏輯地組織你的 Python 程式碼段。
把相關的程式碼分配到一個模組裡能讓你的程式碼更好用,更易懂。模組
能定義函數,類和變數,模組裡也能包含可執行的程式碼。
- python的模組檔案的擴充套件名不一定是.py,比如:將擴充套件名爲.txt的模組檔案匯入
- 以下那個不是python的關鍵字
raise
with
import
final
知識點:python中的關鍵字
- raise拋出異常;
- with語句時用於對try except finally 的優化,讓程式碼更加美觀,如:
with open('file_name','r') as f:
r=f.read()
這條語句就好簡潔很多,當with裏面的語句產生異常的話,也會正常關閉檔案。
等等還有其他用途。
- import匯入
- Python中處理異常的關鍵字有try…finally…,沒見過final
- python中的關鍵字
二、多選
- python函數如下:
def showNnumber(numbers):
for n in numbers:
print(n)
下面 下麪那些在呼叫函數時會報錯?
A.showNumer([2,4,5])
B.showNnumber(‘abcesf’)
C. showNnumber(3.4)
D.showNumber((12,4,5))
知識點:考察python函數的定義與呼叫
- 函數能呼叫首先函數名必須一樣;
- 其次要注意參數型別,比如3.4是浮點數就不能回圈,因此c錯誤
- 定義類如下:
class hello():
def showInfo(sef):
print(self.x):
下面 下麪描述正確的是:
A該類不可以範例化
B 該類可以範例化
C 在pycharm 工具中會出現語法錯誤,說self沒有定義
D 該類可以範例化,並且能正常通過物件呼叫showInfo()
知識點:考察python類的定義與範例化
- python是物件導向的語言,最主要的就是類和範例,類是抽象的模板。
- 建立一個類:
class Studen(object)
class 後接類名,定義的類名大些字母開頭,object爲類的繼承,沒有合適的繼承類用object類。
s = Student()
- 類可以起到模板的作用,所以在建立範例的時候,可以將我們認爲必要的屬性填寫進去,方法
__init__
,它的第一個參數是self
,在方法內部,self表示建立範例本身,所以就可以把各種屬性系結到self:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def get_grade(self):
if self.score >= 90:
return 'A'
elif self.score >= 60:
return 'B'
else:
return 'C'
s = Student('name','score')
- 參數範例化之後,類下的所有方法,都可以呼叫範例參數,格式,self.參數名;
self在__init__
裏面代表範例的本身;
參數傳遞,第一個self不需要傳遞參數,後面的參數正常傳遞。
- 關於python類,說法錯誤的是:
A 類的實體方法必須建立物件後纔可以呼叫
B 類的實體方法必須建立物件前纔可以呼叫
C 類的類方法可以用物件或者類名來呼叫
D 類的靜態方法可以用類名或者物件來呼叫
知識點:python類
- 類(class):是用來描述具有相同的屬性和方法的物件的集合。 它定義了該集閤中每個物件所共有的屬性和方法。
- 物件是類的範例。
- 類中的方法分爲:實體方法和類方法。
(1)類方法:預設有個 cls 參數即類本身,可以被類和物件呼叫,需要加上 @classmethod 裝飾器。
在該類被載入到記憶體時,就分配了入口地址。所以類方法不僅可以被類建立的任何物件呼叫執行,也可以直接通過類名呼叫。
(2)實體方法,隱含的參數爲類範例self, 在類的位元組碼載入到記憶體時,類的實體方法不會被分配入口地址,只有在該類建立了物件之後,纔會分配入口地址,所以範例變數只能通過物件呼叫。
類的實體方法必須建立物件之後纔可以呼叫。 比如物件s
要呼叫類的方法get_grade
,必須等類建立好之後纔可以呼叫,呼叫方法就是s.get_grade
。
- 靜態方法: 用@staticmethod裝飾的不帶self參數的方法叫做靜態方法。
類的靜態方法可以沒有參數,可以直接使用類名呼叫,也可用物件來呼叫。比如:類名.靜態方法
- 總結如下:
- 在C++中,靜態方法與類方法邏輯上是等價的,只有一個概念。
三、問答題
- 介紹異常關鍵字try except else finally的相關意義
答:
try:捕獲異常;
except:出現異常後的處理;異常的型別有多種,except用來捕獲異常資訊並處理;一個
else:如果try中的語句沒有引發異常,則執行else中的語句;
finally:不論是否捕獲到異常,都會執行的語句。
例如:
try:
print(8/int(input("請輸入一個非零整數:")))
except ZeroDivisionError:
print("除數不能爲0")
except ValueError:
print("請重新輸入")
except Exception as reason:
print("未知型別錯誤:" % reason)
else:
print("well")
finally:
print("its ok")
知識點:python中的例外處理關鍵字作用
- 如果當try後的語句執行時發生異常,python就執行第一個匹配該異常的except子句。
- 補充:raise:拋出一個指定的異常。
- #include<filename.h>和#include"filename.h"有什麼區別?
答:
#include<filename.h>是編譯器從標準庫路徑開始搜尋filename.h,使得系統檔案呼叫比較快;
#include"filename.h"是編譯器從使用者的工作路徑開始搜尋filename.h,使得自定義檔案呼叫較快。
一個是系統自帶的標頭檔案庫,一個是使用者自定義的標頭檔案庫。
知識點:C++標頭檔案的區別
- 補充:標頭檔案的作用有哪些?
(1)通過標頭檔案來呼叫庫功能。 出於對原始碼保密的考慮,原始碼不便(或不準 不準)向使用者公佈,只要向使用者提供標頭檔案和二進制的庫即可。使用者只需要按照標頭檔案中的介面宣告來呼叫庫功能,而不必關心介面是怎麼實現的,編譯器會從庫中提取相應的程式碼。
(2)標頭檔案能加強型別安全檢查。 如果某個介面被實現或被呼叫時,其方式與標頭檔案中的宣告不一致,編譯器就會指出錯誤,能大大減輕程式設計師偵錯、改錯的負擔。
程式設計題:一個由小寫字母組成的字串,找出字串中出現次數最多的字母,如果出現次數最多字母有多個那麼輸出最小的那個
- 思路:
(1)先定義一個大小爲26的陣列,用來儲存每個字母出現的次數;
(2)然後找出這個陣列中的最大值;
(3)輸出最大值所對應的英文小寫字母
using namespace std;
void FindMaxSumStr(string str)
{
if(str == "")
return;
int len = str.size();
int sum[26] = {0};
int r = 0;
for(int i=0;i<len;i++)
{
sum[str[i]-'a']++;
}
int count = 0;
for(int i=0;i<26;i++)
{
if(sum[i]>count)
{
count = sum[i];
r = i;
}
}
cout<<char(r+'a');
}
int main()
{
string s = "abccdd";
FindMaxSumStr(s);
return 0;
}
輸出結果: