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