我的PAT-BASIC代码仓:https://github.com/617076674/PAT-BASIC
原题链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805298269634560
题目描述:
知识点:数组
思路:交换第一个0和第一个非0字符的位置
由于本题我们不知道要读入多少个数字,因此我们每读入一个数字都需要判断getchar() == '\n'。如果满足getchar() == '\n',说明已经读到了末尾,跳出循环。否则,还没有到末尾,我们可以继续读入下一个数字。
首先对输入的字符按个数从0-9进行排序,如果没有0字符,那么所得结果即为最小的数。否则,交换第一个0字符和第一个非0字符的位置,即得最小的数。
C++和Java不同,在处理函数传值时,我们要把数组的地址传进去,而不能只传数组值。
时间复杂度是O(n),其中n为输入的数字总个数。空间复杂度是O(1)。
C++代码:
#include<iostream>
#include<vector>
using namespace std;
void swap(vector<int>& nums, int i, int j);
void printNums(vector<int> nums);
int main() {
int temp;
vector<int> nums;
vector<int> digits;
while (true) {
cin >> temp;
nums.push_back(temp);
if (getchar() == '\n') {
break;
}
}
for (int i = 0; i < nums.size(); i++) {
for (int j = 0; j < nums[i]; j++) {
digits.push_back(i);
}
}
if (digits[0] == 0) {
int index = -1;
for (int i = 0; i < digits.size(); i++) {
if (digits[i] != 0) {
index = i;
break;
}
}
swap(digits, 0, index);//digits是数组地址值
}
printNums(digits);
}
//vector<int>& nums传递进的是数组地址值
void swap(vector<int>& nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
void printNums(vector<int> nums) {
for (int i = 0; i < nums.size(); i++) {
cout << nums[i];
}
}
C++解题报告: