从C语言到C++_14(vector的常用函数+相关选择题和OJ题)(上):https://developer.aliyun.com/article/1520824
2. vector 相关选择题
1. 下面这个代码输出的是( )
#include <iostream> #include <vector> using namespace std; int main(void) { vector<int>array; array.push_back(100); array.push_back(300); array.push_back(300); array.push_back(300); array.push_back(300); array.push_back(500); vector<int>::iterator itor; for(itor=array.begin();itor!=array.end();itor++) { if(* itor==300) { itor=array.erase(itor); } } for(itor=array.begin();itor!=array.end();itor++) { cout<<*itor<<" "; } return 0; }
A.100 300 300 300 300 500
B.100 300 300 300 500
C.100 300 300 500
D.100 300 500
E.100 500
F.程序错误
2. std::vector::iterator 没有重载下面哪个运算符( )
A.==
B.++
C.*
D.>>
3. 下面有关vector和list的区别,描述错误的是( )
A.vector拥有一段连续的内存空间,因此支持随机读取,如需要高效的随机读取,应使用vector
B.list拥有一段不连续的内存空间,如需要大量的插入和删除,应使用list
C.vector::iterator支持“+”、“+=”、“<”等操作符
D.list::iterator则不支持“+”、“+=”、“<”等操作符运算,但是支持了[ ]运算符
4.下面程序的输出结果正确的是( )
int main() { int ar[] = {1,2,3,4,5,6,7,8,9,10}; int n = sizeof(ar) / sizeof(int); vector<int> v(ar, ar+n); cout<<v.size()<<":"<<v.capacity()<<endl; v.reserve(100); v.resize(20); cout<<v.size()<<":"<<v.capacity()<<endl; v.reserve(50); v.resize(5); cout<<v.size()<<":"<<v.capacity()<<endl; }
A.10:10 20:100 5:50
B.10:20 20:100 5:100
C.10:10 20:100 5:100
D.10 10 20:20 20:50
5. T是一个数据类型,关于std::vector::at 和 std::vector::operator[] 描述正确的是( )
A.at总是做边界检查, operator[] 不做边界检查.
B.at 不做边界检查, operator[] 做边界检查.
C.at和operator[] 都是会做边界检查的
D.以上都不对
3. vector 相关OJ题
(可以先刷一部分熟悉C++的刷题方式,后面再回来刷)
136. 只出现一次的数字 - 力扣(LeetCode)
难度简单
给你一个 非空 整数数组 nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。
找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1 :
输入:nums = [2,2,1]
输出:1
示例 2 :
输入:nums = [4,1,2,1,2]
输出:4
示例 3 :
输入:nums = [1]
输出:1
提示:
1 <= nums.length <= 3 * 10^4
-3 * 104 <= nums[i] <= 3 * 10^4
- 除了某个元素只出现一次以外,其余每个元素均出现两次
class Solution { public: int singleNumber(vector<int>& nums) { } };
解析代码:
以前讲异或讲过的单身狗,直接重拳出击:
class Solution { public: int singleNumber(vector<int>& nums) { int val = 0; for(const auto& e : nums) { val ^= e; } return val; } };
118. 杨辉三角 - 力扣(LeetCode)
难度简单
给定一个非负整数 numRows
,生成「杨辉三角」的前 numRows
行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:
输入: numRows = 1
输出: [[1]]
提示:
1 <= numRows <= 30
class Solution { public: vector<vector<int>> generate(int numRows) { } };
解析代码:
杨辉三角写过类似的,这换成C++,vector 里面有个 vector<int> ,可以先理解为二维数组写:
class Solution { public: vector<vector<int>> generate(int numRows) { vector<vector<int>> vv; vv.resize(numRows); for (size_t i = 0;i < numRows;i++)// 开空间和把每一行的第一个和最后一个置为1 { vv[i].resize(i + 1, 0); //vv[i][0] = vv[i][vv[i].size() - 1] = 1; vv[i].front() = vv[i].back() = 1;// 即上一行注释掉的代替 } for (size_t i = 0;i < vv.size();i++)// 填充剩下的数据 { for (size_t j = 0;j < vv[i].size();j++) { if (vv[i][j] == 0) { vv[i][j] = vv[i - 1][j - 1] + vv[i - 1][j]; } } } return vv; } };
这里的vector<vector<int>>空间上就是和二维数组类似的,操作就是调用了两次[ ] 运算符重载:
26. 删除有序数组中的重复项 - 力扣(LeetCode)
难度简单
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。 - 返回
k
。
示例 1:
输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
示例 2:
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
提示:
1 <= nums.length <= 3 * 10^4
-104 <= nums[i] <= 10^4
nums
已按 升序 排列
class Solution { public: int removeDuplicates(vector<int>& nums) { } };
解析代码:
用C语言写过了,再次重拳出击,复制粘贴改一点点:
class Solution { public: int removeDuplicates(vector<int>& nums) { //运用快慢指针思想 时间O(N) 空间O(1) int slow = 0, fast = 1; while (fast < nums.size()) { if (nums[fast] != nums[slow]) { nums[++slow] = nums[fast];//不同就拷贝进慢指针的后一个 } fast++;//同和不同都++ } nums.resize(slow + 1);// 加不加都行,因为这题不用删除后面的元素,但其它题用呢? return slow + 1;//多少个不同就++一下,但是第0个已经是不同的了(同就不会++) //难理解可以把slow和fast初始值改成-1和0,直接返回slow } };