vector——练习题

1. 杨辉三角

杨辉三角

在这里插入图片描述
在这里插入图片描述

C:二维数组要动态开辟
C++:二维数组用vector就行

class Solution{
    public:
         vector<vector<int>> generate(int numRows){
        vector<vector<int>> vv;
        //需要初始化所以用resize
        vv.resize(numRows);
        for (size_t i = 0; i < vv.size(); ++i)
        {
            //头尾给1,其他给0
            
            vv[i].resize(i+1,0);    
            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] + vv[i-1][j-1];
                                    
                }            
            }        
        }
        return vv;
        }
        
};

两层嵌套
vector<vector> vv
vv[i][j] -> vv.operator[i]
第一层调用是vv[i],vv.operator[i]返回值是vector
第二层调用vv[i][j],vector.operator[j]返回值是int

 
 

2. 删除有序数组中的重复项

题目
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
 
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
 
将最终结果插入 nums 的前 k 个位置后返回 k 。
 
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

链接力扣(LeetCode)

思路
C
通过挪动数据
dst与src对比相等src就++
遇到不相等了就先++dst再将src赋值过去
返回数组新长度就是 return dst+1

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
    int src = 0,dst = 0;
    while(src < nums.size())
    {
        if(nums[src] == nums[dst])
        {
            ++src;        
        }
        else
        {
            nums[++dst] = nums[src++];        
        }    
    }
    nums.resize(dst+1);
    return dst+1;
    }
};

不需要返回值的情况,要将dst之后的数据都删掉
nums.resize(dst+1);

 
 

3.电话号码的字母组合

电话号码的字母组合
在这里插入图片描述

深度优先遍历
数字映射对应的字符串(固定的)

class Solution {
    char* numToStr[10] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
    //string numToStr[10] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
public:
    //给个子函数进行递归
    void Combine(string digits,int di, vector<string>& retV, string combineStr)
    {
        if(di == digits.size())
        {
            retV.push_back(combineStr);
            return;        
        }    
        //取数字字符映射字符串
        int num = digits[di] - '0';
        string str = numToStr[num];
        for(auto ch : str)
        {
            Combine(digits, di+1, retV, combineStr+ch);        
        }
    }
    vector<string> letterCombinations(string digits) {
       vector<string> v;
       if(digits.empty())
       return v;
       
       string str;
       Combine(digits, 0, v, str);
       
       return v;
    }
};
### C++ 期末考试练习题 #### 题目一:静态成员函数与 `this` 指针的理解 考虑如下代码片段: ```cpp #include <iostream> using namespace std; class T { public: static void show_x() { // 错误,this指针只存在于非静态函数内部[^2] return this->x; } private: static int x; }; int T::x = 1; // 静态数据成员类外初始化 int main() { return 0; } ``` 上述代码尝试在一个静态成员函数中使用 `this` 指针访问私有变量 `x`。然而,在静态成员函数内无法直接通过 `this` 访问实例成员或调用其他非静态成员函数,因为静态成员属于整个类而不是某个特定对象。 为了修正这个问题,可以修改为直接访问静态成员变量的方式: ```cpp static void show_x() { cout << x; } ``` #### 题目二:文件流操作实践 下面是一个简单的例子来展示如何打开并读取文本文件的内容到字符串缓冲区中去。这里使用到了 `<fstream>` 库中的 `ifstream` 类来进行文件输入操作,并利用了 `ios::ate` 参数指定从文件末尾开始定位光标位置[^3]。 ```cpp #include <fstream> #include <string> void readFile(const char* filename) { ifstream iofile(filename, ios::in | ios::binary); if (!iofile.is_open()) { cerr << "Failed to open file." << endl; return; } // 移动至文件结尾获取大小 iofile.seekg(0, ios::end); streampos size = iofile.tellg(); string buffer(size, '\0'); iofile.seekg(0); // 将文件内容读入buffer iofile.read(&buffer[0], size); cout << buffer; iofile.close(); } int main(){ readFile("abc.txt"); return 0; } ``` 这段代码展示了基本的文件处理流程,包括检查文件是否成功打开、计算文件长度以及将文件内容加载到内存中打印出来。 #### 题目三:基础算法实现——快速排序 对于初学者来说,掌握一些经典的数据结构和算法是非常重要的。以下是关于快速排序的一个简单实现案例[^1]: ```cpp #include <vector> #include <algorithm> // 快速排序函数定义 std::vector<int> quickSort(std::vector<int>& nums){ if (nums.size() <= 1) return nums; auto pivot = nums[nums.size()/2]; std::vector<int> left ,middle, right; for(auto& num : nums){ if(num<pivot)left.push_back(num); else if(num==pivot)middle.push_back(num); else right.push_back(num); } // 对左右两侧继续递归执行快排 left=quickSort(left),right=quickSort(right); left.insert(left.end(),middle.begin(),middle.end()); left.insert(left.end(),right.begin(),right.end()); return left; } int main(){ std::vector<int> data={7,9,-1,4,6}; data=quickSort(data); for(int d:data)cout<<d<<" "; return 0; } ``` 此版本实现了经典的分治法思想下的快速排序逻辑,适用于教学目的的教学演示用途。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hey pear!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值