一、明明的随机数答案
明明的随机数是一道经典的算法问题。题目要求输入一个长度为n的正整数数列,随机选取其中的若干个数,去重后输出这些数字,且按照升序排列。我们可以用set数据结构实现去重,再用sort函数排序即可。
// C++代码示例
#include<set>
#include<algorithm>
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;
set<int> s;
for(int i=0;i<n;i++){
int x;
cin >> x;
s.insert(x);
}
cout << s.size() << endl;
for(auto x: s){
cout << x << " ";
}
return 0;
}
二、明明的随机数python3
Python3中可以直接用set去重,再转为列表。由于set自动去重和内部的排序规则,代码实现起来非常简单。
# Python3代码示例
n = int(input())
s = set(map(int, input().split()))
ans = list(s)
ans.sort()
print(len(ans))
print(*ans)
三、明明的随机数c语言
C语言没有set这种现成的数据结构,需要手动实现去重。我们可以用循环遍历整个数组,判断是否有重复元素。为了快速判断元素是否存在,可以用标记法,将元素和下标对应,出现过的元素对应的下标位置标记为1,后续再出现这个元素时,直接判断该元素对应的下标是否为1,如果为1则为重复元素,跳过即可。
// C语言代码示例
#include<stdio.h>
#include<stdlib.h>
int a[1001];
int main(){
int n;
scanf("%d", &n);
for(int i=0;i<n;i++){
int x;
scanf("%d", &x);
a[x]=1;
}
int cnt=0;
for(int i=1;i<=1000;i++){
if(a[i]){
cnt++;
}
}
printf("%d\n", cnt);
for(int i=1;i<=1000;i++){
if(a[i]){
printf("%d ", i);
}
}
return 0;
}
四、明明的随机数c
C语言中也可以使用标记法实现去重,只需要定义一个数组来存储元素是否出现过即可。
// C代码示例
#include<stdio.h>
#include<stdlib.h>
int a[1001];
int main(){
int n;
scanf("%d", &n);
for(int i=0;i<n;i++){
int x;
scanf("%d", &x);
a[x]=1;
}
int cnt=0;
for(int i=1;i<=1000;i++){
if(a[i]){
cnt++;
}
}
printf("%d\n", cnt);
for(int i=1;i<=1000;i++){
if(a[i]){
printf("%d ", i);
}
}
return 0;
}
五、明明的随机数标记法c语言
在c语言中,可以使用标记法对元素进行去重。我们定义一个数组a来存储每个元素是否出现过,初始值为0。遍历输入的序列时,若该元素尚未出现过,则将其对应的a数组下标标记为1。
// c语言代码示例
#include<stdio.h>
#include<stdlib.h>
int a[1001];
int main(){
int n;
scanf("%d", &n);
for(int i=0;i<n;i++){
int x;
scanf("%d", &x);
a[x]=1;
}
int cnt=0;
for(int i=1;i<=1000;i++){
if(a[i]){
cnt++;
}
}
printf("%d\n", cnt);
for(int i=1;i<=1000;i++){
if(a[i]){
printf("%d ", i);
}
}
return 0;
}
六、明明的随机数c++语言
C++语言可以使用set容器或者unordered_set容器实现去重。set容器自动按升序进行排序,而unordered_set容器则具有O(1)的快速查找和插入特性。
// C++代码示例
#include<set>
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;
unordered_set<int> s;
for(int i=0;i<n;i++){
int x;
cin >> x;
s.insert(x);
}
cout << s.size() << endl;
for(auto x: s){
cout << x << " ";
}
return 0;
}
七、明明的随机数先去重c语言
在c语言中,除了使用标记法进行去重之外,还可以先将输入的序列排序,再扫描一遍进行去重。这个方法在元素值很大的情况下可能不太适用。
// c语言代码示例
#include<stdio.h>
#include<stdlib.h>
int a[1001];
int cmp(const void* a, const void* b){
return *(int*)a-*(int*)b;
}
int main(){
int n;
scanf("%d", &n);
int ans[1001], cnt=0;
for(int i=0;i<n;i++){
scanf("%d", &a[i]);
}
qsort(a, n, sizeof(int), cmp);
for(int i=1;i<n;i++){
if(a[i]!=a[i-1]){
ans[cnt++]=a[i];
}
}
ans[cnt++]=a[n-1];
printf("%d\n", cnt);
for(int i=0;i<cnt;i++){
printf("%d ", ans[i]);
}
return 0;
}
八、明明的随机数格式错误
在输入数据时,可能会出现格式错误的情况,比如换行符被输入到了数字中,或者输入了非数字字符等。我们可以通过检查每个数字是否合法,即是一个正整数且在1~1000范围之内,来解决格式错误的问题。
// c++代码示例
#include<iostream>
#include<set>
#include<string>
using namespace std;
int main(){
int n;
cin >> n;
set<int> ans;
string s;
getline(cin, s);
for(int i=0;i<n;i++){
getline(cin, s);
int x=0, flag=1;
for(int j=0;j<s.size();j++){
if(s[j]'9'){
flag=0;
break;
}
x=x*10+s[j]-'0';
if(x>1000){
flag=0;
break;
}
}
if(flag){
ans.insert(x);
}
}
cout << ans.size() << endl;
for(auto x: ans){
cout << x << " ";
}
return 0;
}
九、明明的随机数洛谷
在洛谷上,明明的随机数问题存在一些约束:输入数字的范围是1~10000,样例数目不超过10个,每个样例中元素的个数不超过1000个等。可以参考下面的代码实现。
// c++代码示例
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
int n;
cin >> n;
vector<int> ans;
for(int i=0;i<n;i++){
int k;
cin >> k;
vector<int> a(k);
for(int i=0;i<k;i++){
cin >> a[i];
}
sort(a.begin(), a.end());
a.erase(unique(a.begin(), a.end()), a.end());
for(auto x: a){
ans.push_back(x);
}
}
sort(ans.begin(), ans.end());
ans.erase(unique(ans.begin(), ans.end()), ans.end());
cout << ans.size() << endl;
for(auto x: ans){
cout << x << " ";
}
return 0;
}
十、明明的随机数c语言查重该怎么办
对于c语言,我们可以使用标记法进行查重。读入每个数字时,如果在这个数字之前出现过,即已经被标记为1,则说明是重复的数字,直接跳过即可。
// c语言代码示例
#include<stdio.h>
#include<stdlib.h>
int a[1001];
int main(){
int n;
scanf("%d", &n);
for(int i=0;i<n;i++){
int x;
scanf("%d", &x);
if(a[x]==0){
a[x]=1;
}
else{
continue;
}
printf("%d ", x);
}
return 0;
}
原创文章,作者:MSAY,如若转载,请注明出处:https://www.506064.com/n/142556.html