构造特定数组的逆序拼接
问题描述
小U得到了一个数字n,他的任务是构造一个特定数组。
这个数组的构造规则是:对于每个i从1到n,将数字n到i逆序拼接,直到i等于n为止。
最终,输出这个拼接后的数组。
例如,当n等于3时,拼接后的数组是 [3, 2, 1, 3, 2, 3]。
测试样例
样例1:
输入:n = 3 输出:[3, 2, 1, 3, 2, 3]
样例2:
输入:n = 4 输出:[4, 3, 2, 1, 4, 3, 2, 4, 3, 4]
样例3:
输入:n = 5 输出:[5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5]
样例分析
示例 1:n = 3
- i = 1 时,拼接
[3, 2, 1] - i = 2 时,拼接
[3, 2] - i = 3 时,拼接
[3]
结果数组:[3, 2, 1, 3, 2, 3]
示例 2:n = 4
- i = 1 时,拼接
[4, 3, 2, 1] - i = 2 时,拼接
[4, 3, 2] - i = 3 时,拼接
[4, 3] - i = 4 时,拼接
[4]
结果数组:[4, 3, 2, 1, 4, 3, 2, 4, 3, 4]
示例 3:n = 5
- i = 1 时,拼接
[5, 4, 3, 2, 1] - i = 2 时,拼接
[5, 4, 3, 2] - i = 3 时,拼接
[5, 4, 3] - i = 4 时,拼接
[5, 4] - i = 5 时,拼接
[5]
结果数组:[5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5]
对于每个 i 从 1 到 n,生成从 n 到 i 的逆序部分 for (int i = 1; i <= n; ++i) { 添加从 n 到 i 的部分 for (int j = n; j >= i; --j) { result.push_back(j); } }
代码如下
#include <vector>
#include <iostream>
using namespace std;
vector<int> solution(int n) {
vector<int> result;
for (int i = 1; i <= n; i++) {
for (int j = n; j >= i; j--) {
result.push_back(j);
}
}
return result;
}
int main() {
vector<int> result1 = solution(3);
cout << (result1 == vector<int>{3, 2, 1, 3, 2, 3}) << endl;
vector<int> result2 = solution(4);
cout << (result2 == vector<int>{4, 3, 2, 1, 4, 3, 2, 4, 3, 4}) << endl;
vector<int> result3 = solution(5);
cout << (result3 == vector<int>{5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5}) << endl;
return 0;
}
找出整型数组中占比超过一半的数
问题描述
给定一个长度为n的整型数组,已知其中一个数字的出现次数超过数组长度的一半,找出这个元素
输入格式
一个长度为n的数组,其中某个元素的出现次数大于n/2
输出格式
一个整数
输入样例
[1, 3, 8, 2, 3, 1, 3, 3, 3]
输出样例
3
数据范围
任意长度为n整数数组,其中某个元素的出现次数大于n/2
采用摩尔投票算法。
#include <iostream>
#include <vector>
using namespace std;
int solution(vector<int> array) {
int candidate = 0;
int count = 0;
for (int num : array) {
if (count == 0) {
candidate = num;
}
count += (num == candidate) ? 1 : -1;
}
return candidate;
}
int main() {
cout << (solution({1, 3, 8, 2, 3, 1, 3, 3, 3}) == 3) << endl;
cout << (solution({5, 5, 5, 3, 4, 5}) == 5) << endl;
return 0;
}