Java篇
在Java中,以下數據類型中,需要內存最多的是(long)
- A選項byte:占用1個字節(8位)
- B選項long:占用8個字節(64位)
- C選項Object:Object本身是一個引用,在32位JVM中占4字節,在64位JVM中占8字節。但這里指的是引用而不是對象實際占用的堆內存。
- D選項int:占用4個字節(32位)
創建數組時必須指定第一維的大小。
float f[][] = new float[6][6];這個行
float [][]f = new float[6][6];這個行
float []f[] = new float[6][6];這也行
float [][]f = new float[6][];這是創建不規則數組(交錯數組)的寫法。只指定第一維的大小,第二維的大小可以動態指定,這樣每行可以有不同的列數。
Collection是最基本的集合接口,List,Set是繼承自Collection的子接口,Map不是。
Vector線程同步,ArrayList、LinkedList線程不同步。?
TreeMap中元素有序。
HashMap通過hashcode對其內容進行快速查找,但是無序。
關于以下程序輸入結果是: (Not?equal)
public class IfTest {
public static void main(String args[]) {
boolean x = false;
boolean y = false;
if (x = y)
System.out.println("Equal");
else
System.out.println("Not equal");
}
}
在java中,“=”表示賦值;而“==”表示判斷左右兩邊的值是否相等,當然,如果兩邊都是引用對象,則比較的是地址;
if(x=y)相當于把y賦給x,if(x=false)
以下的程序輸入結果是:(134)
public static void main(String args[]) {
try {
System.out.print(1);
long l = 4 / (1 - 1);
System.out.print(2);
return;
} catch (Exception e) {
System.out.print(3);
return;
} finally {
System.out.print(4);
}
}
指出下面程序的運行結果:1a2b2b
class A{
static{
System.out.print("1");
}
public A(){
System.out.print("2");
}
}
class B extends A{
static{
System.out.print("a");
}
public B(){
System.out.print("b");
}
}
public class Hello{
public static void main(String[] ars){
A ab = new B();
ab = new B();
}
}
父類靜態變量(父類靜態代碼塊)-->子類靜態變量(子類靜態代碼塊)-->父類成員變量(父類成員代碼塊)-->父類構造方法-->子類成員變量(子類成員代碼塊)-->子類構造函數
靜態對象/變量優于非靜態對象/變量的初始化,其中靜態變量/對象只會初始化一次,非靜態變量/對象可能會初始化多次; ? ??
父類優先于子類進行初始化;
如果希望某個變量只可以被類本身訪問和調用,則應該使用下列哪一種訪問控制修飾 (private)
private關鍵字是java中最嚴格的訪問控制修飾符,保證變量或方法只能在當前類內部被訪問和調用,實現了數據封裝。
public是最開放的訪問修飾符,可被任何類訪問。
protected允許同一包內的其他類以及不同包中的子類。
equals相等的兩個對象,hashcode一定相等。
單列集合頂層接口Collection
單列Collection:
(PS:集合的工具類Collections)
雙列集合:
JVM篇
C/C++篇
在C語言中,關于靜態變量的說法正確的是(函數中的靜態變量,在函數退出后不被釋放)
在函數中聲明的靜態變量(static)具有靜態存儲期,其生命周期與程序運行期相同。即使函數執行結束,靜態局部變量也不會被釋放,而是保持其值直到程序結束。下次調用該函數時,該變量仍保持上次的值。
靜態變量和常量是不同的概念。常量是指值不可改變的量,而靜態變量的值是可以改變的,只是其存儲位置和生命周期與普通變量不同。
靜態變量可以多次賦值和修改。
靜態全局變量的作用域僅限于定義它的源文件內,不能被其他源文件訪問。這體現了static關鍵字對變量作用域的限制作用,用于控制變量的可見性。
靜態變量的主要特點是:
1. 存儲在靜態存儲區
2. 生命周期與程序運行期相同
3. 未經初始化時自動初始化為0
4. 作用域受限于聲明它的文件或函數內
下面描述中,表達正確的有(ACD)
A
公有繼承是基類中的public成員在派生類中仍是public的
B
公有繼承是基類中的private成員在派生類中仍是private的
C
公有繼承是基類中的protected成員在派生類中仍是protected的
D
私有繼承是基類中的public成員在派生類中仍是private的
對于int?*pa[5]?;的描述,正確的是(pa是一個具有5個元素的指針數組,每個元素是一個int型指針)
?
short a[100], sizeof(a)的值是(200)
一個short變量占用2字節
void swap(int a, int b){
? ? int t = a;
? ? a = b;
? ? b = t;
}
…
int x = 2;
int y = 3;
swap(x, y);
下面程序運行之后,x的值是(2)
值傳而不是址傳。僅僅是方法里的參數副本交換了。
要實現真正的交換,需要使用引用傳遞(void swap(int& a, int& b))或指針傳遞(void swap(int* a, int* b))。
要判斷運算結果類型是否相同,需要理解Java中數值運算的類型轉換規則:
1. 當操作數中有浮點數時,結果為浮點數類型
2. 除法運算中,如果除數和被除數都是整數,結果為整數;如果有一個是浮點數,結果為浮點數
?
給定C語言數據結構
struct T{
? ? long w;
? ? union U {
? ? ? ? char c;
? ? ? ? int i;
? ? ? ? double d;
? ? } u1;
} T1;
假設在64位系統下,在不考慮字對齊方式的情況下
為存儲T1結構所需要的存儲區域可能為(16)字節。
聯合體U大小由最大成員決定。
?
A是重寫,重寫就是方法名、方法的參數和返回類型都必須相同。
C和D是重載,重載就是方法名相同,但參數不同。
設?a、b、c、d、m、n均為?int型變量,且?a=5、b=6、c=7、d=8、m=2、n=2,則邏輯表達式?(m=a>b)&&(n=c>d)運算后,n的值為(C)
A0
B1
C2
D3
邏輯運算符&&(與)只有符號兩邊都成立才為真,當符號前邊運算結果為假時,會產生“短路”,所以不再計算后面表達式的值。
數據結構篇
邏輯結構和存儲結構
邏輯結構是數據元素之間的關系,存儲結構是數據元素及其關系在計算機中的存儲方式。
存儲結構有順序、鏈式、索引、散列四種,邏輯結構有線性和非線性結構。
二叉樹是邏輯結構,樹屬于邏輯結構中的非線性結構。
雙向鏈表、哈希表、循環隊列都是存儲結構分別屬于鏈式、散列和順序。
最大堆中插入一條數據的時間復雜度是(O(log(n)))
堆是一種滿足特定條件的完全二叉樹(除了最后一層的節點,其他每一層的節點都是滿的,且最后一層的節點都靠左連續排列),主要可以分為兩種類型。
大根堆:父節點的值大于或等于子節點的值。
小根堆:父節點的值小于或等于子節點的值。
設有一個棧,元素進棧的次序為5,?3,?7,?3,?9,?3,則棧的不可能的出棧次序是(3,?9, 5,?7,?3, 3)。
數據結構出棧順序_嗶哩嗶哩_bilibili
已知一個數值有序表{3,?6,?9,?12,?15,?18,?21,?24,?27,?30,?33, 35},當二分查找值為31的元素時,查找失敗的比較次數為(4)
18->27->33->30
如下陳述中正確的是(串是一種特殊的線性表)
字符串,由 n 個字符組成的一個整體( n >= 0 )。這 n 個字符可以由字母、數字或者其他字符組成。
空串:含有零個字符的串。
空格串:只包含空格的串。
算法篇
對于物品數量 n=4,承重 W=8 的背包問題,已知要裝入背包的物品分別是
w=2,c=3(重量為2,價值為3)
w=3,c=4
w=4,c=5
w=5,c=6
每個物品最多選一次,請問往背包里最多放入價值為多少的物品(10)
使用KMP算法在主串 "abaabaabcabaabc" 中搜索模式串 "abaabc",到匹配成功時為止,請問在匹配過程中進行的單個字符間的比較次數是(10)。
【天勤考研】KMP算法易懂版_嗶哩嗶哩_bilibili
給出以下遞歸代碼,問其時間復雜度是多少?O(2的n次冪)有點像二叉樹
void recursiveFunction(int n) {
? ? if (n <= 0) {
? ? ? ? return;
? ? }?
? ? else {
? ? ? ? cout << n << endl;
? ? ? ? recursiveFunction(n - 1);
? ? ? ? recursiveFunction(n - 1);
? ? }
}
時間復雜度為O(nlog2n)的排序算法有(快速排序、堆排序)。
設有以下四種排序方法,則(快速排序)的空間復雜度最大
A
冒泡排序
B
快速排序
C
堆排序
D
希爾排序
冒泡排序,時間復雜度O( n^2 ),空間復雜度O(1),數據結構合集 - 冒泡排序(算法過程, 算法改進, 效率分析, 穩定性分析)_嗶哩嗶哩_bilibili
冒泡一定是比較次數更多。
數據結構合集 - 簡單選擇排序(選擇排序)(算法過程, 效率分析, 穩定性分析)_嗶哩嗶哩_bilibili
簡單選擇排序是不穩定的。
在順序表(1,5,8,10,13,15,17,19,25,28,40)中,用二分法查找關鍵碼值11,所需的關鍵碼比較次數為4
15->8->10->13
數據庫篇
事務四大特性ACID:原子性、一致性、隔離性、持久性
下列哪個SQL語句用于對當前事務設置約束模式?SET CONSTRAINTS
可以使用SET CONSTRAINTS對當前事務設置約束模式,并且主要是INITIALLY IMMEDIATE或者INITIALLY DEFERRED模式,故B項正確;
而A項的SET TRANSACTION則是設置事務的操作,故A項排除;
C項的SERIALIZABLE則是數據庫隔離級別的一個選項,設置為此選項可以避免幻讀,故C項排除;
IMMEDIATE則是約束模式的一種類型,D排除。
在關系數據庫系統中,為了簡化用戶的查詢操作,而又不增加數據的存儲空間,常用的方法是創建(視圖(view))
視圖簡化用戶查詢操作 ?而不是提高查詢速度
軟件工程篇
軟件工程是一種(自頂向下)分階段實現的軟件工程開發的方法。
主鍵是數據庫中具有唯一型的字段,也就是說數據表中的任意兩條記錄都不可能擁有相同的主鍵字段。主鍵值不允許為空,不允許重復。在設計數據庫時可以靠設置主鍵來提高數據查詢性能。
軟件工程的基本原則包括:抽象,信息隱蔽,模塊化,局部化,確定性,一致性,完備性,可驗證性。
自底向上不是軟件工程原則。
計網篇
TCP協議三次握手和四次揮手的過程
建立連接時,要進行三次握手。
第一次握手:客戶端發送SYN包到服務器,并等待服務器確認
第二次握手:服務器收到SYN包后,向客戶端發送一個確認包SYN+ACK
第三次握手:客戶端收到服務器的SYN+ACK包后,向服務器發送確認包ACK
關閉連接時,要進行四次揮手。
第一次揮手:客戶端發送一個FIN包,表示申請斷開連接,等待服務器確認
第二次揮手:服務器回復一個ACK包,表示接受到客戶端的關閉連接請求,此時服務器會檢查是否還有未處理完的數據
第三次揮手:如果服務器有未處理完的數據,會繼續處理,處理完畢后,會向客戶端發送一個FIN包,表示可以斷開連接
第四次揮手:客戶端收到服務器的FIN包后,回復一個ACK包,表示確認斷開連接
TCP/IP協議中不會被使用到的協議
SMTP(簡單郵件傳輸協議)不會被使用到,因為SMTP是專門用于電子郵件傳輸的協議,而不是用于網站訪問。
B選項HTTP: 錯誤,訪問網站必然會使用HTTP協議,它是網絡瀏覽器和網站服務器之間傳輸數據的標準協議。
C選項TCP: 錯誤,TCP協議負責在客戶端和服務器之間建立可靠的連接,確保數據傳輸的完整性,是HTTP協議的底層傳輸協議。
D選項IP: 錯誤,IP協議負責網絡尋址和路由,使數據包能夠在互聯網上正確傳遞到目標服務器,是整個網絡通信的基礎。
瀏覽網站的基本通信流程是:應用層使用HTTP協議進行數據交換,傳輸層使用TCP協議確保可靠傳輸,網絡層使用IP協議進行路由尋址。而SMTP協議僅用于電子郵件系統,與網站訪問無關。
HTTP響應碼
HTTP狀態碼是由3位數字組成:
- 2xx(200-299):表示成功
- 3xx(300-399):表示重定向
- 4xx(400-499):表示客戶端錯誤
- 5xx(500-599):表示服務器錯誤
以下哪個功能比較適合使用UDP協議?(數據多播)
UDP適合數據多播,TCP和擁塞控制,流量控制有關
使用鼠標單擊一個萬維網文檔時,若該文檔除文本外,還有3幅gif畫像,且文檔和3幅gif畫像都在同一個服務器上,則在HTTP/2.0中需要建立(0)次UDP連接和(1)次TCP連接。
HTTP基于TCP,HTTP1.1后一個TCP連接傳輸多個文件
不是HTTPS相比HTTP的劣勢的是(需要對傳輸數據進行壓縮)
IPV4中,數據包傳播方式包括以下的(廣播、單播、組播)
在局域網模型中,數據鏈路層分為(邏輯鏈路控制子層和媒體訪問控制子層)。
操作系統篇
產生死鎖的4個必要條件:互斥條件、請求保持條件、不可剝奪條件?、環路條件
下面關于操作系統的說法正確的是
操作系統是管理計算機軟件和硬件資源的程序集合
Linux進程中,應用可見的內存空間是一樣的,是如何做到的(使用虛擬內存轉換)
在用戶態執行的進程,如果需要訪問內核態的資源,通常會通過什么方式?直接讀取內核態的內存
在 Linux 終端中,如何查找包含特定文本 "keyword" 的文件?grep keyword *
grep命令是Linux系統中最常用的文本搜索工具之一。A選項"grep keyword *"是正確的命令格式,它會在當前目錄下搜索所有文件中包含"keyword"的內容。grep命令支持正則表達式,可以進行復雜的文本匹配,而且搜索結果會顯示匹配行的內容和所在文件名。
B選項"find -text keyword"是錯誤的命令格式。find命令主要用于按照文件名、文件類型等條件搜索文件,而不是搜索文件內容。正確的find命令格式應該是"find . -name "*keyword*""。
C選項"search keyword *"是錯誤的,因為Linux系統中沒有名為"search"的標準命令。
D選項"locate keyword"是錯誤的,因為locate命令是用來快速查找文件名的工具,它會在系統的文件數據庫中搜索文件名,而不是搜索文件內容。
某操作系統采用信號量機制實現進程同步,共有50個進程需要訪問一個共享資源。為了保證互斥訪問,系統引入了一個二進制信號量作為臨界區的互斥鎖。現在需要選擇正確的信號量初值,使得只有一個進程能夠進入臨界區。假設進程在進入臨界區之前會嘗試獲取信號量,若信號量值為0,則進程會被阻塞。以下選項中,哪個是正確的信號量初值?1
操作系統中,信號量機制用于實現進程間的同步和互斥,二進制信號量是一種特殊的信號量,其值只能為0或1,通常用于實現互斥鎖,確保同一時間只有一個進程可以進入臨界區。
信號量工作原理:
1.初始化:信號量的初始值通常設置為1,表示資源可用。
2.P操作(等待操作):當一個進程嘗試進入臨界區時,會執行P操作(也稱為wait操作)。如果信號量的值為1,表示資源可用,信號量的值減1,進程進入臨界區。如果信號量的值為0,表示資源已被其他進程占用,當前進程會被阻塞,等待資源釋放。
3.V操作(信號操作):當一個進程離開臨界區時,會執行V操作(也稱為signal操作),信號量的值加1,表示資源已釋放,如果有等待的進程,其中一個會被喚醒,嘗試進入臨界區。
在一個并發編程環境中,P、V操作的信號量S初值為4,當前值為-1,則表示有多少個等待進程(1)
在 Linux Shell 中,下面創建變量的語句錯誤的是(name = "Tom")
1. Shell變量名可以由字母、數字和下劃線組成,但不能以數字開頭
2. 變量的值可以是數字、字符串等
3. 如果變量值包含空格,必須用引號(單引號或雙引號)括起來
4. 變量賦值時最重要的規則就是等號兩邊絕對不能有空格
沒學不懂,回頭看
刪除aaa文件夾,需要執行的操作是:rm?–rf?$HOME/aaa
-r 表示向下刪除所有文件,-f 表示直接刪除
rmdir 無法刪除非空目錄
linux操作系統中,修改用戶密碼的命令是(passwd)
?
操作系統是對(計算機資源)進行管理的軟件。
下面對進程的描述中,錯誤的是:(進程是指令的集合)
程序是指令和數據的有序集合,是一個靜態的概念。
進程是對指令的描述,進程是程序在處理機上的一次執行過程,它是一個動態的概念。
進程是由進程控制塊、程序段、數據段三部分組成。
進程之間通信的途徑:管道、信號量、消息隊列、共享內存。
編程
字符逆序
將一個字符串str的內容顛倒過來,并輸出。
如:輸入“I?am?a?student”,輸出“tneduts?a?ma?I”。
保證字符串長度不超過100。
import java.util.Scanner;// 注意類名必須為 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);String s=in.nextLine();StringBuilder str=new StringBuilder(s);str.reverse();System.out.println(str);}
}
一開始用的是next()方法,空格也作為終止符了。
后來用的是nextLine()方法,這回每次讀取整行字符串,包含空格。
刪除有序數組重復元素
給定一個整形數組 nums,固定升序排列,請你刪除重復元素,返回刪除后數組的新長度。
import java.util.HashSet;
import java.util.Scanner;// 注意類名必須為 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);String s= in.nextLine();String arr[]=s.split(",");HashSet set=new HashSet<>();for (int i = 0; i < arr.length; i++) {set.add(arr[i]);}System.out.println(set.size());}
}
split()分割
set可去重?
在字符串中找出連續最長的數字串
現有一個字符串str,輸出字符串str中的最長的數字子串。
import java.util.ArrayList;
import java.util.Scanner;// 注意類名必須為 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);String s= in.nextLine();char[] array = s.toCharArray();ArrayList strs=new ArrayList<>();String str="";for (int i = 0; i < array.length; i++) {if (Character.isDigit(array[i])){str+=array[i];if (i== array.length-1)strs.add(str);}else {strs.add(str);str="";}}//分割int max=0;int index=0;for (int i = 0; i < strs.size(); i++) {str=(String) strs.get(i);max=Math.max(str.length(),max);if (max==str.length())index=i;}System.out.println(strs.get(index));}
}
?Character.isDigit(array[i]) //判斷字符array[i]是不是數字
在一個字符串中找到出現指定次數的字符并通過控制臺輸出
如輸入abaccdeff及1,則通過控制臺輸出:
b
d
e
如輸入abaccdeff及2,則通過控制臺輸出:
a
c
f
import java.util.*;class Main{public static void main(String[] args) {Scanner sc=new Scanner(System.in);String str= sc.next();int n= sc.nextInt();char[] charArray = str.toCharArray();Set<Character> set=new HashSet<>();for (char c : charArray) {set.add(c);}Set<Character> set1=new HashSet<>();for (Character o : set) {int t=0;for (int i = 0; i < charArray.length; i++) {if(o==charArray[i]){t++;}}if (t==n){set1.add(o);}}for (Character c : set1) {System.out.println(c);}}
}
set可去重,map鍵值對。
薯券使用問題(無限背包/硬幣找零問題)[動態規劃]
某小紅薯在小紅書的活動中抽獎中了一定價值的薯券,這些薯券可以用來購買一批商品,求有多少種購買組合。其中一件商品可以買多件。
輸入:薯券金額、商品分別價格
輸出:組合數