煙臺網(wǎng)站制作公司網(wǎng)站發(fā)布與推廣方案
這篇就一直更新一些C++的選擇題和編程題了。
目錄
筆試題1
答案及解析1
筆試題2
答案及解析2
力扣編程題
88.?合并兩個有序數(shù)組
解析代碼
349.?兩個數(shù)組的交集
解析代碼
60.?排列序列
解析代碼
46.?全排列
解析代碼
本篇完。
筆試題1
1. 以下哪種STL容器中的對象是連續(xù)存儲的:()
A.list
B.vector
C.map
D.set
2.?STL中的一級容器有:()
A.vector、deque、list、set、multiset、map、multimap
B.序列式容器、關聯(lián)式容器、容器適配器
C.set、multiset、map、multimap
D.vector、deque、list
3.?以下STL的容器存放的數(shù)據(jù),哪個肯定是排好序的()
A.vector
B.deque
C.list
D.map
4.?當很頻繁地對序列中部進行插入和刪除操作時,應該選擇使用的容器是()
A.vector
B.list
C.deque
D.stack
5.?下面有關vector和list的區(qū)別,描述錯誤的是? ()
A.vector擁有一段連續(xù)的內(nèi)存空間,因此支持隨機存取,如果需要高效的隨即存取
B.list擁有一段不連續(xù)的內(nèi)存空間,如果需要大量的插入和刪除,應該使用list
C.vector<int>::iterator支持“+”、“+=”、“<”等操作符
D.list<int>::iterator則不支持“+”、“+=”、“<”等操作符運算,但是支持了[ ]運算符
6.?關于vector<>初始化問題下面那個是非法的??()
A.vector<string> sVec;
B.vector<vector<int>> ivvec;
C.vector<vector<string>> svvec( "hello");
7.?T是一個數(shù)據(jù)類型,關于std::vector::at 和 std::vector::operator[] 描述正確的是: ()
A.at總是做邊界檢查, operator[] 不做邊界檢查
B.at不做邊界檢查, operator[] 做邊界檢查
C.at和operator[] 是一樣的
D.at下標越界拋異常,operator[]下標越界觸發(fā)斷言
8.?STL中的unordered_map和priority_queue使用的底層數(shù)據(jù)結構分別是什么?()
A.rbtree,queue
B.hashtable,heap
C.rbtree,heap
D.hashtable,queue
9.?map和unordered_map的區(qū)別說法錯誤的是()
A.map的底層是紅黑樹,unordered_map的底層結構是哈希表
B.map是有序的,unordered_map不是,且map的查詢效率更高
C.map和unordered_map底層存儲的都是鍵值對
D.map和unordered_map的應用場景不同
10.?下面關于deque說法正確的是()
A.deque沒有vector尾插效率高
B.deque的底層是一段連續(xù)空間
C.如果要對集合中的元素進行排序時,元素不適合放在deque中
D.deque是priority_queue的底層默認容器
答案及解析1
1. B
??A:錯誤,list的底層結構為帶頭結點的雙向循環(huán)鏈表,是鏈式結構
??B:正確,vector是動態(tài)類型順序表,底層是一段連續(xù)空間
??C:錯誤,map底層是紅黑樹,樹形結構
??D:錯誤,set底層是紅黑樹,樹形結構
2. D
??一級容器即序列式容器(存的不是)
??A:錯誤,set、multiset、map、multimap是關聯(lián)式容器,不是序列式容器
??B:錯誤,非題目所問
??C:錯誤,都是關聯(lián)式容器
??D:正確
3. D
map的底層是紅黑樹,紅黑樹是二叉搜索樹,二叉搜索樹中的元素如果按照中序遍歷,可以得到一個有序序列
4. B
頻繁的向序列中插入和刪除元素時,應該選擇鏈式結構
list底層結構為:帶頭結點的雙向循環(huán)鏈表
5. C
??A:正確:構造了一個空的vector,里面放置的是string類型的對象
??B:正確:構造了一個空的動態(tài)二維數(shù)組
??C:錯誤,svvec是二維的,vector套vector,不能直接使用"hello"構造
6. C
??A:正確:構造了一個空的vector,里面放置的是string類型的對象
??B:正確:構造了一個空的動態(tài)二維數(shù)組
??C:錯誤,svvec是二維的,vector套vector,不能直接使用"hello"構造
7. D
??at和operator[]都是通過下標獲取對應的元素,兩個的不同是:
??at在下標越界時,拋異常
??operator[]在下標越界時,觸發(fā)斷言
8. B
unordered_map底層使用的是哈希表,priority_queue底層使用的是堆
9. B
??A:正確
??B:錯誤,map底層是紅黑樹,查詢效率為O(logN),unordered_map底層是哈希表,查詢效率為 O(1),?unordered_map查詢的效率更高
??C:正確
??D:正確,map適合要求結果有序的常見,unordered_map適合是否有序無關,更關注查詢效率的場景
10. C
??A:錯誤,如果在不擴容的情況下deque和vector相同,需要擴容時就不同了,vector擴容需要搬移 大量的元素,deque不需要
??B:錯誤,deque是分段連續(xù)的,類似動態(tài)的二維數(shù)組
??C:正確,因為要排序就需要遍歷,而deque不適合編譯,因為其在遍歷時,要不斷的去檢測迭代 器是否在空間邊界
??D:錯誤,priority_queue底層的默認容器是vector
筆試題2
1. 下面關于適配器說法正確的是()
A.在STL中,stack和queue與vector一樣,都是容器
B.STL中只有容器適配器
C.適配器有自己獨立的底層數(shù)據(jù)結構,不需要借助其他結構
D.適配器是一種設計模式,該種模式是將一個接口包裝成客戶希望的另一個接口
2.?下面哪一個不是適配器()
A.stack
B.queue
C.反向迭代器
D.以上都是
3.?關于仿函數(shù)說法正確的是()
A.仿函數(shù)就是一個函數(shù)
B.仿函數(shù)可以是靜態(tài)成員函數(shù)
C.仿函數(shù)是函數(shù)對象,可以像函數(shù)調(diào)用方式使用的對象
D.仿函數(shù)與函數(shù)指針作用不同
4.?關于仿函數(shù)說法錯誤的是()
A.仿函數(shù)可以使算法功能更加靈活
B.如果想要讓一個類的對象按照函數(shù)方式使用,只需在其中將()重載即可
C.lambda表達式底層實際就是按照仿函數(shù)實現(xiàn)的
D.仿函數(shù)與函數(shù)指針都可以增加算法的靈活性
5. 填寫下面空格
1. merge()算法的功能是:_______________________________________________
2. reverse()算法的功能是:_____________________________________________
3. unique()算法的功能是:______________________________________________
4. next_permutation()算法的功能是:____________________________________
5. sort()算法的功能是:_______________________________________________
答案及解析2
1. D
??A:錯誤,在STL中stack和queue被認為是容器適配器,因為它們的底層結構是直接將deque封裝 了一下
??B:錯誤,除了容器適配器,還有迭代器適配器,函數(shù)適配器
??C:錯誤,適配器沒有自己獨立的底層數(shù)據(jù)結構,是將其他結構拿過來重新包裝的
??D:正確,迭代器模式概念
2. D
??A:正確,stack是對deque的重新封裝
??B:正確,queue是對deque的重新封裝
??C:正確,反向迭代器失對正向迭代器的封裝
??D:錯誤
3. C
??A:錯誤,仿函數(shù)是一個類中重載了(),該類的對象可以像函數(shù)一樣使用的對象
??B:錯誤,仿函數(shù)是依靠對象調(diào)用的,沒有對象無法使用,因為不能是靜態(tài)成員函數(shù)
??C:正確
??D:錯誤,作用基本是類似的,都是增加算法的靈活性,只不過C++中使用仿函數(shù)更多
4. B
A:正確,STL中的算法都是通用的,有些算法具體的做的事情需要用戶通過仿函數(shù)方式定制
B:錯誤,是重載()而不是(],注意看題
C:正確,lambda表達式編譯器在編譯時會在底層將其轉化為仿函數(shù)
D:正確
- merge(first1, last1,first2,last2, resutl)算法的功能是:將兩個有序序列合并成一個序列保存到result中,合并好之后依然有序
- reverse(first, last)算法的功能是:對[first, last)區(qū)間中的元素逆序
- unique(first, last)算法的功能是:對[first, last)區(qū)間中的元素去重
- next_permutation(first,last)算法的功能是:獲取當前序列的下一個排列組合
- sort(first,last)算法的功能是:對[first, last)區(qū)間中的元素排序,重載版本可以指定排升序還是降序
力扣編程題
88.?合并兩個有序數(shù)組
給你兩個按?非遞減順序?排列的整數(shù)數(shù)組?nums1
?和?nums2
,另有兩個整數(shù)?m
?和?n
?,分別表示?nums1
?和?nums2
?中的元素數(shù)目。
請你?合并?nums2
?到?nums1
?中,使合并后的數(shù)組同樣按?非遞減順序?排列。
注意:最終,合并后數(shù)組不應由函數(shù)返回,而是存儲在數(shù)組?nums1
?中。為了應對這種情況,nums1
?的初始長度為?m + n
,其中前?m
?個元素表示應合并的元素,后?n
?個元素為?0
?,應忽略。nums2
?的長度為?n
?。
示例 1:
輸入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 輸出:[1,2,2,3,5,6] 解釋:需要合并 [1,2,3] 和 [2,5,6] 。 合并結果是 [1,2,2,3,5,6] ,其中斜體加粗標注的為 nums1 中的元素。
示例 2:
輸入:nums1 = [1], m = 1, nums2 = [], n = 0 輸出:[1] 解釋:需要合并 [1] 和 [] 。 合并結果是 [1] 。
示例 3:
輸入:nums1 = [0], m = 0, nums2 = [1], n = 1 輸出:[1] 解釋:需要合并的數(shù)組是 [] 和 [1] 。 合并結果是 [1] 。 注意,因為 m = 0 ,所以 nums1 中沒有元素。nums1 中僅存的 0 僅僅是為了確保合并結果可以順利存放到 nums1 中。
提示:
nums1.length == m + n
nums2.length == n
0 <= m, n <= 200
1 <= m + n <= 200
-109 <= nums1[i], nums2[j] <= 109
解析代碼
C語言寫過了,雙指針
class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int end = m + n - 1; // 雙指針if(m == 0){nums1[0] = nums2[0];}while(n > 0 && m > 0){if(nums1[m-1] >= nums2[n-1]) // 小的放后面{nums1[end--] = nums1[m-1];m--;}else{nums1[end--] = nums2[n-1];n--;}}while(n > 0) // 第二個數(shù)組還有就拷貝過去{nums1[end--] = nums2[n-1];n--;}}
};
349.?兩個數(shù)組的交集
給定兩個數(shù)組?nums1
?和?nums2
?,返回?它們的交集?。輸出結果中的每個元素一定是?唯一?的。我們可以?不考慮輸出結果的順序?。
示例 1:
輸入:nums1 = [1,2,2,1], nums2 = [2,2] 輸出:[2]
示例 2:
輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 輸出:[9,4] 解釋:[4,9] 也是可通過的
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
解析代碼
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set s1(nums1.begin(),nums1.end()); // 去重unordered_set s2(nums2.begin(),nums2.end());vector<int> retV;if(s1.size() <= s2.size()){for(const auto& e : s1){if(s2.find(e) != s2.end()){retV.push_back(e);}}}else{for(const auto& e : s2){if(s1.find(e) != s1.end()){retV.push_back(e);}}}return retV;}
};
60.?排列序列
給出集合?[1,2,3,...,n]
,其所有元素共有?n!
?種排列。
按大小順序列出所有排列情況,并一一標記,當?n = 3
?時, 所有排列如下:
"123"
"132"
"213"
"231"
"312"
"321"
給定?n
?和?k
,返回第?k
?個排列。
示例 1:
輸入:n = 3, k = 3 輸出:"213"
示例 2:
輸入:n = 4, k = 9 輸出:"2314"
示例 3:
輸入:n = 3, k = 1 輸出:"123"
提示:
1 <= n <= 9
1 <= k <= n!
解析代碼
這題是困難題,和下面一題一樣應該不提倡用next_permutation的,但沒學高階算法就先這樣用了
next_permutation函數(shù)在頭文件<algorithm>中,作用是是生成給定序列的下一個較大排序,直到序列按降序排列為止。到這里還需要強調(diào)的一點是,如果你希望生成所有的排列方式,一定要先將序列按升序排列,這里可以與sort函數(shù)結合起來使用,先用sort升序排列,再調(diào)用next_permutation函數(shù)。
class Solution {
public:string getPermutation(int n, int k) {string str = string("123456789").substr(0,n);while(--k){next_permutation(str.begin(), str.end());}return str;}
};
46.?全排列
給定一個不含重復數(shù)字的數(shù)組?nums
?,返回其?所有可能的全排列?。你可以?按任意順序?返回答案。
示例 1:
輸入:nums = [1,2,3] 輸出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
輸入:nums = [0,1] 輸出:[[0,1],[1,0]]
示例 3:
輸入:nums = [1] 輸出:[[1]]
提示:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums
?中的所有整數(shù)?互不相同
解析代碼
提倡不用next_permutation的,但沒學高階算法就先這樣用了,先用sort升序排列
class Solution {
public:vector<vector<int>> permute(vector<int>& nums) {vector<vector<int>> vv;sort(nums.begin(), nums.end());do{vv.push_back(nums);}while(next_permutation(nums.begin(), nums.end()));return vv;}
};
本篇完。
C++到這基本介紹了,有時間可以回去復習復習,還有一兩篇關于多線程的問題放到Linux操作系統(tǒng)之后再放出來了,到這C++也夠用了。
下一篇:零基礎Linux_1(前期準備)Linux發(fā)展史和環(huán)境安裝。
下下篇:零基礎Linux_2(基本指令_上)目錄/文件的顯示跳轉創(chuàng)建刪除。