【LeetCode】通用操作总结

二维矩阵_转置

// 二维数组
// 二维数组可以通过嵌套vector<vector<int>> vec构建出来
vector<vector<int>> vec(2, vector<int>(2, 0)); // 2 * 2的矩阵,全部初始化为0

// 注意嵌套的下标
string Transpose(const string& str)
{
    int len = str.size();
    int side = sqrt(len);
    if (len != side * side) {
        return "ERROR";
    }
    
    int count = 0;
    char arry[side][side];
    for (int i = 0; i < side; i++) {
        for (int j = 0; j < side; j++) { // 写错了,这个起始点坐标应该是0,错误写成j = i
            arry[i][j] = str[count++];
        }
    }

    for (int i = 0; i < side; i++) {
        for (int j = i + 1; j < side; j++) {
            char temp = arry[i][j];
            arry[i][j] = arry[j][i];
            arry[j][i] = temp;
        }
    }

    string res = "";
    for (int i = 0; i < side; i++) {
        for (int j = 0; j < side; j++) {
            res += arry[i][j];
        }
    }
    return res;
}

find

字符串str,直接调用string类中的find函数查找元素
set数组,直接调用find函数查找元素

vector /map/list,通过find(xx.begin(), xx.end(), value)查找元素

int firstIndex = str.find_first_of(cha);
int lastIndex = str.find_last_of(cha);

str.find("4") != string::npos ||str.find("18") != string::npos

string str = "45618";
int i = str.find("4"); // 0
int j = str.find("18"); // 3

// set
if (st.find(cal) != st.end()) {
    res++;
}

// vector
vector<string> vec2 = {"time","me","bell"};
if (find(vec2.begin(), vec2.end(), "time") != vec2.end()) {
    
}

// map
auto iter = find(mp.begin(), mp.end(), value);
if (iter == mp.end()) {
    int first = iter.first;
    int second = iter.second;   
}

// list * 操作取出地址内容
 std::list<int> myList = {1, 2, 3, 4, 5};
 int toFind = 3;

 auto it = std::find(myList.begin(), myList.end(), toFind);

 if (it != myList.end()) {
     std::cout << "Element found: " << *it << std::endl;
 }

pow

// 次方运算
pow(numSet.size(), 4);

queue 优先队列priority_queue

queue<int> q;

int tmp = q.front(); // 队头元素

q.pop();
q.push(tmp);


// 插入元素后需要动态变化,更新最大值和最小值,可以考虑用优先队列
// 更新方式:取出队头元素存入临时变量,更新结果,再存入队列

//升序队列
priority_queue <int,vector<int>,greater<int>> q; // 队头开始从小到大排列
// 队头最大:降序队列
priority_queue <int,vector<int>,less<int>>q; // 不写默认队头最大,队头开始从大到小排列

// 队头最小:多个元素的优先队列,按照第一个元素排序
priority_queue<tuple<int, int>, vector<tuple<int, int>>, greater<>> queServer; // 每次将最小的放在队头(默认按照第一个元素排列!!!)

rand

// 随机数:取出map中任意一个元素 
int randomIndex = rand()%mp.size();

reverse

// 字符串
reverse(str.begin(), str.end());

// 数组
reverse(vec.begin(), vec.end());

set

// set插入元素
st.insert(a);

//删除元素
st.erase(a);

// 清空元素
st.clear();

// vector必须按照索引删除元素
// set可以直接删除指定元素,如删除set res中子字符串
https://leetcode.cn/problems/short-encoding-of-words/submissions/
// set删除重复元素
// 删除相同元素,优先考虑用set,先把数组中的元素过滤一遍,重复的删除
set <"time", "me", "bell">
for (auto& str : res) {
    for (int i = 1; i < str.size(); i++) {
        res.erase(str.substr(i)); // 遍历每一个元素,删除子字符串(下次比那里res已被更新,只有bell元素)
    }
}


// set的查找(vector map相同,set直接找元素就行)
int Proc(vector<int>& arr, int diff)
{
    // 在此添加你的代码
    set<int> st;
    for (auto a : arr) {
        st.insert(a);
    }

    int res = 0;
    for (auto value : arr) {
        int cal = value + diff;
        if (st.find(cal) != st.end()) {
            res++;
        }
    }
    return res;
}

vector

vector<map<int, int>>
map<int, vector<int>>

//初始化
vector<tuple<int, int>> roomSytem(1000); // 1、长度初始化
vector<tuple<int, int>> roomSytem(1000, make_tuple(0, 0)); //2、初始化长度,并附初值
vector<int> res(2, 0); // 初始化固定长度2,元素全为0

// 合并两个数组(不需要用两个for循环)
vector<int> merge;
merge.insert(merge.end(), arr.begin(), arr.end());
merge.insert(merge.end(), arr.begin(), arr.end());

// 求vector中的最大值和最小值
// 进阶1:排序取首尾元素
// 进阶2:直接用系统函数
vector<int> words = { 1,2,1 };
int max = *max_element(words.begin(), words.end());
int min = *min_element(words.begin(), words.end());

// 取vector尾部元素
vector<int> res;
int end = res.back(); 

// 判断两个数组是否相等,直接if判断
if (vec1 == vec2)

// vector删除元素(迭代器对应索引)
num.erase(num.begin() + i); // vector中删除一个元素

vector<int> num = { 5,4,3,2,1 };
num.erase(num.begin(), num.begin() + 3); // 2 1 // 如果是中间不包含最后一个元素
num.erase(num.begin() + 3, num.end()); // 5 4 3 // 如果是end,直接删除到最后

// vector清空元素
vec.clear();

// vector是否有序
if (is_sorted(num.begin(), num.end()) || is_sorted(num.begin(), num.end(), greater<>()))

// 删除数组元素后是否有序
int SortByDeleteOne(const vector<int> &Nums)
{
    int res = INT_MAX;
    for (int i = 0; i < Nums.size(); i++) {
        vector<int> num = Nums;
        int tmp = num[i];
        num.erase(num.begin() + i);
        if (is_sorted(num.begin(), num.end()) || is_sorted(num.begin(), num.end(), greater<>())) {
            res = min(res, tmp);
        }
    }
    return res == INT_MAX ? -1 : res;
}

// 统计vector中字符个数
vector<string> vec2 = {"time","me","bell", "time"};
int num = count(vec2.begin(), vec2.end(), "time");

// 只取vector前3个元素(先把遍历长度确定,再遍历vector取指定长度的元素)
int len = res.size() >= 10 ? 10 : res.size();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值