合并有序数组
Time Limit:1s Memory Limit: 256M
Description:
假设有两个非递增序列 A 与 B ,要求将它们合并为一个非递增序列 C 。(不可使用任何排序算法完成)
Input:
第一行输入第一个非递增序列,以-1结尾。
第二行输入第二个非递增序列,以-1结尾。
Output:
输出合并后的非递增序列
Sample input:
8 5 4 -1
7 6 3 1 -1
Sample output:
8 7 6 5 4 3 1
约束: 每个序列中元素个数最多不超过100000 ,所有数字都在带符号的 32 位整数范围内(signed 32-bit integers)。
请使用c++语言,谢谢。
该回答引用ChatGPT-3.5,仅供参考,不保证完全正确
下面是一个用C++编写的合并有序数组的程序。它使用了两个指针分别指向两个输入序列的当前元素,通过比较大小将较大的元素插入到合并后的序列中。由于输入序列是非递增的,所以比较的逻辑是相反的(从大到小)。
#include <iostream>
#include <vector>
std::vector<int> mergeArrays(const std::vector<int>& arr1, const std::vector<int>& arr2) {
std::vector<int> merged;
int i = 0; // Pointer for arr1
int j = 0; // Pointer for arr2
while (i < arr1.size() && j < arr2.size()) {
if (arr1[i] >= arr2[j]) {
merged.push_back(arr1[i]);
i++;
} else {
merged.push_back(arr2[j]);
j++;
}
}
// Append remaining elements from arr1 (if any)
while (i < arr1.size()) {
merged.push_back(arr1[i]);
i++;
}
// Append remaining elements from arr2 (if any)
while (j < arr2.size()) {
merged.push_back(arr2[j]);
j++;
}
return merged;
}
int main() {
std::vector<int> arr1, arr2;
int num;
// Read input for arr1
while (std::cin >> num && num != -1) {
arr1.push_back(num);
}
// Read input for arr2
while (std::cin >> num && num != -1) {
arr2.push_back(num);
}
std::vector<int> merged = mergeArrays(arr1, arr2);
// Print the merged array
for (int i = 0; i < merged.size(); i++) {
std::cout << merged[i] << " ";
}
return 0;
}
你可以将输入序列按照题目要求输入,程序将输出合并后的非递增序列。请注意,程序假设输入按照要求格式输入,没有进行输入验证。在实际应用中,可能需要添加输入验证逻辑来确保输入的有效性。
该回答引用NewBing,仅供参考,不保证完全正确
这个问题有多种解决方法,我在网上搜索了一些相关的资料,你可以参考一下:
#include <iostream>
using namespace std;
int main()
{
int a[100001];
int b[100001];
int result[200003];
int i, j;
for (i = 0; 1; i++)
{
int x;
cin >> x;
if (x == -1) break;
a[i] = x;
}
for (j = 0; 1; j++)
{
int x;
cin >> x;
if (x == -1) break;
b[j] = x;
}
int ai = 0;
int bi = 0;
for (int k = 0; k < i + j - 2; k++)
{
if (ai == -1)
result[k] = b[bi++];
else if (bi == -1)
result[k] = a[ai++];
else if (a[ai] > b[bi])
result[k] = a[ai++];
else
result[k] = b[bi++];
}
for (int k = 0; k < i + j - 2; k++)
cout << result[k] << " ";
return 0;
}