20250228-Rain

1. 一维数组

/*
1. 数字环
有一个长度为n的数字环, 将每个数字往后移动m位, 使其成为一个新的数字环
输入: 
第一行: 整数n  表示有n个数字
第二行: n个整数Ni, 表示数字环的每个元素
第三行: 整数m  表示每个元素需要往后移动m位
输出: 移动后的新数字环
(1<=m<n<100, MIN_INT<Ni<MAX_INT)
*/

#include <iostream>
#include <vector>

using namespace std;

void reverse(vector<int>& nums, int left, int right)
{
    while(left < right)
    {
        int temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
        left++;
        right--;
    }
}

int main(void)
{
    int n;
    cout << "Please input 'n': ";
    cin >> n;

    vector<int> N(n, 0);
    cout << "Please input 'N[]'(space to separate): " << endl;
    for(int i = 0; i < n; i++)
    {
        cin >> N[i];
    }

    int m;
    cout << "Please input 'm': " << endl;
    cin >> m;

    reverse(N, 0, n - 1);
    reverse(N, 0, m - 1);
    reverse(N, m, n - 1);

    // output
    for(int i = 0; i < n; i++)
    {
        cout << N[i] << " ";
    }
    cout << endl;
    
    return 0;
}

2. 多维数组

/*
2. 颈椎病治疗
最近云海学长一直对着电脑改bug, 颈椎不舒服, 希望各位小伙伴帮云海学长治治
提供一张图片, 将图片旋转后再发给云海学长, 这样学长看图的时候就需要歪着脖子, 时间久了, 颈椎病就
治好了
输入一个数字构成的矩形, 将矩形的值进行90度旋转后打印
*/

#include <iostream>
#include <vector>

using namespace std;

int main(void)
{
    int n;
    cout << "Please input 'n': ";
    cin >> n;

    vector<vector<int>> m_matrix(n, vector<int>(n, 0));
    cout << "Please input element of matrix: " << endl;
    for (auto &p : m_matrix)
    {
        for (auto &q : p)
        {
            cin >> q;
        }
    }

    int left = 0;
    int right = n - 1;

    while (left < right)
    {
        for (int i = 0; i < right - left; i++)
        {
            int top = left;
            int bottom = right;
            int top_left = m_matrix[top][left + i];
            m_matrix[top][left + i] = m_matrix[bottom - i][left];
            m_matrix[bottom - i][left] = m_matrix[bottom][right - i];
            m_matrix[bottom][right - i] = m_matrix[top + i][right];
            m_matrix[top + i][right] = top_left;
        }
        left++;
        right--;
    }

    for (auto &p : m_matrix)
    {
        for (auto q : p)
        {
            cout << q << ' ';
        }
        cout << endl;
    }
    return 0;
}

3. 一维数组

/*
4. 删除重复值
阿伟学长在开发一款游戏, 他希望玩家已经获得的道具会降低爆率, 避免玩家获得太多重复的道具
但玩家背包中道具是乱序且不确定的, 为了减小判断的运算量, 需要先对数据进行去重.
设计一个程序, 输入数据数量N, 以及N个整数Ni. 将该组数据去重后打印
(1<N<100,  0 <= Ni <= MAX_INT)
样例输入:
 10
 1 3 2 6 2 6 4 8 2 6
样例输出:
 1 3 2 6 4 8
*/

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(void)
{
    // 原始数组大小
    int n;
    cout << "Please input 'n': ";
    cin >> n;

    // 原始数组
    vector<int> N(n, 0);
    cout << "Please input 'N[](space to separate)': ";
    for(auto &element : N)
    {
        cin >> element;
    }

    // 排序
    sort(N.begin(), N.end());
    

    // 去重操作
    int i = 1;
    while(i < N.size())
    {
        if(N[i - 1] == N[i]) // 如果前后相等,则去重
        {
            N.erase(N.begin() + i);
            i--;    // 避免下标变化引起错误,回退下标 重新检查
        }
        i++;
    }

    for(auto &element : N)
    {
        cout << element << ' ';
    }
    return 0;
}

或使用一个新数组保存结果元素。

逻辑简化。空间复杂度变高,但可以减少调用 erase.()

/*
4. 删除重复值
阿伟学长在开发一款游戏, 他希望玩家已经获得的道具会降低爆率, 避免玩家获得太多重复的道具
但玩家背包中道具是乱序且不确定的, 为了减小判断的运算量, 需要先对数据进行去重.
设计一个程序, 输入数据数量N, 以及N个整数Ni. 将该组数据去重后打印
(1<N<100,  0 <= Ni <= MAX_INT)
样例输入:
 10
 1 3 2 6 2 6 4 8 2 6
样例输出:
 1 3 2 6 4 8
*/

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(void)
{
    int n;
    cout << "Please input 'n': ";
    cin >> n;

    vector<int> N(n, 0);
    cout << "Please input 'N[](space to separate)': ";
    for(auto &i : N)
    {
        cin >> i;
    }

    sort(N.begin(), N.end());

    vector<int> res;
    res.push_back(N[0]);

    for(int i = 1; i < n; i++)
    {
        if (N[i] != N[i-1]) {
            res.push_back(N[i]); // 不重复的存入 res
        }
    }

    for(auto &i : res)
    {
        cout << i << ' ';
    }
    return 0;
}

或使用 C++unique() 方法

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(void)
{
    // 原始数组大小
    int n;
    cout << "Please input 'n': ";
    cin >> n;

    // 原始数组
    vector<int> N(n);
    cout << "Please input 'N[]' (space to separate): ";
    for (auto &element : N)
    {
        cin >> element;
    }

    // 排序
    sort(N.begin(), N.end());

    // 使用unique函数去重
    auto last = unique(N.begin(), N.end());
    N.erase(last, N.end());  // 删除重复元素

    // 输出结果
    for (auto &element : N)
    {
        cout << element << ' ';
    }
    cout << endl;

    return 0;
}

Last updated