对于明明生成的 个 到 之间的随机整数,你需要帮助他完成以下任务:
删去重复的数字,即相同的数字只保留一个,把其余相同的数去掉;
然后再把这些数从小到大排序,按照排好的顺序输出。
你只需要输出最终的排序结果。
第一行输入一个整数 ,代表明明生成的数字个数。
此后 行,第 行输入一个整数 ,代表明明生成的随机整数。
输出若干行,每行输出一个整数,代表输入数据排序后的结果。第一行输出最小的数字。
3 2 2 1
1 2
提供一个边输入边申请空间排序的解法
#include <stdio.h> int cmp(int *a, int *b){ return *a-*b; } int main(){ int N = 0; //输入为空时结束 while(~scanf("%d\n",&N)){ int num = 0; //留出一个位置用于设置结束条件 int *p = (int *)malloc(sizeof(int)*(N+1)); //清空内存 memset(p,0,sizeof(int)*(N+1)); for(int i=0; i<N; i++){ scanf("%d\n",&p[i]); } //快排函数运用,只排序前N个 qsort(p,N,sizeof(int),cmp); int *t = p; //不清空内存就要在这设置 t[N] = '\0'; //用while的坏处就是结尾后面如果连接别的数据就会继续循环 while(*t != '\0'){ // if(*t == num){ // *t++; // continue; // } // else{ // num = *t++; // printf("%d\n",num); // } if(*t != *(t-1)) printf("%d\n",*t); *t++; } free(p); t = NULL; } return 0; }
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n; while(cin>>n) { vector<int> nums(n,0); for(int i = 0;i<n;i++) { cin>>nums[i]; } sort(nums.begin(),nums.end()); for(int i = 0;i<n;i++) { if(i>0&&nums[i]==nums[i-1]){continue;} cout<<nums[i]<<endl; } } }一个数组两次遍历,完事
while(len = parseInt(readline(), 10)) { const buffer = Array(len).fill(0).map(() => parseInt(readline(), 10)); console.log([...new Set(buffer.sort((a, b) => a - b))].join('\n')) }
#include<iostream> using namespace std; int main() { int data[1001] = {0}; int n; int d; int max_index; while(cin>>n) {max_index = 0;while(n--) { cin >> d; data[d] = 1; max_index = d > max_index ? d : max_index; } for(int i=1;i <= max_index; i++) { if (data[i] == 1) { cout << i << '\n'; data[i] = 0; } } } }
// 自测没问题,保存并提交就出问题了,牛客你为什么这么烂!!!! const listNum = []; var data = ''; var size = 0; while(data = readline()){ if (size === 0) { size = data } else { size--; listNum.push(data); } } const sortList = listNum.sort((a, b) => a - b); console.log(sortList .filter((item, index) => item !== sortList[index + 1]) .join('\n')) // 自测没问题,保存并提交就出问题了,牛客你为什么这么烂!!!!
#include <stdio.h> static const int MAX_NUM = 1001; void srotArray(int* array,int num) { int temp[MAX_NUM] = {0}; int i; for(i=0;i<num;i++) { temp[array[i]] = 1; } for(i=0;i<MAX_NUM;i++) { if(temp[i]==1) printf("%d\n",i); } } int main() { int num = 0; int ch = 0; int ret = 0; int array[MAX_NUM] = {0}; while(1) { ret = scanf("%d",&num); if(ret<=0) { break;//读取失败返回0,退出。 } for(int i = 0;i<num;i++) { array[i] = 0; } for(int i = 0;i<num;i++) { ret = scanf("%d",&ch); if(ret<=0) { continue;//读取失败返回0,退出。 } array[i] = ch; } srotArray(array,num); } }
var arr=[]; var start=0; var num=0; while(line=parseInt(readline())){ if(start==0){ num=line; } else if(start<=num) { arr.push(line); } else{ start=0; num=line; } start++; } arr.sort((a,b)=>{return a-b}); for(var i=0;i<arr.length;i++){ if(i==0) console.log(arr[0]); else if(arr[i]==arr[i-1]) continue; else console.log(arr[i]); }(javascript v8 代码)题目有错误。输入跟实际输入不一致,导致我的代码一直运行不了。
插入排序一遍遍历,边遍历边去重
def insert_sort(arr): nums = set() dup_nums = 0 i = 1 nums.add(arr[0]) while i < len(arr): key = arr[i] if key in nums: dup_nums = dup_nums + 1 i = i + 1 continue nums.add(key) j = i - 1 - dup_nums while j >= 0 and arr[j] > key: arr[j+1], arr[j] = arr[j], arr[j+1] j = j - 1 arr[j+1], key = key, arr[j + 1] i = i + 1 return arr[:len(arr)-dup_nums]
[61,25,29,105,52,108,73,58,38,64,14,55,98,94,102,35,60,68,15,27,103,73,55,35,33,47,35,16,31,108,46,65,89,13,51,51,99,113,66,111,99,64,54,117,20,14,106,9,29,11,25,100,58,79,69,84,106,59,92,42,11,92]
排序去重之后少了第一个元素 61
以下是测试样例的结果:
[9, 11, 13, 14, 15, 16, 20, 25, 27, 29, 31, 33, 35, 38, 42, 46, 47, 51, 52, 54, 55, 58, 59, 60, 64, 65, 66, 68, 69, 73, 79, 84, 89, 92, 94, 98, 99, 100, 102, 103, 105, 106, 108, 111, 113, 117]
实际正确的结果:
[9, 11, 13, 14, 15, 16, 20, 25, 27, 29, 31, 33, 35, 38, 42, 46, 47, 51, 52, 54, 55, 58, 59, 60, 61, 64, 65, 66, 68, 69, 73, 79, 84, 89, 92, 94, 98, 99, 100, 102, 103, 105, 106, 108, 111, 113, 117]
#include<stdio.h> #include<iostream> #include<set> using namespace std; int main() { std::set<int> eliminate_repeat; int num; while(std::cin>>num) { while(num--) { int value; std::cin >> value; eliminate_repeat.insert(value); } for(auto i:eliminate_repeat) std::cout << i << std::endl; } return 0; }
import java.util.Scanner; import java.util.Set; import java.util.TreeSet; public class Main{ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Set<Integer> set = new TreeSet<Integer>(); while(scanner.hasNext()) { int n = scanner.nextInt(); int[] inputArray = new int[n]; for(int i = 0;i < n;i ++) { inputArray[i] = scanner.nextInt(); set.add(inputArray[i]); } for (Integer i : set) { System.out.println(i); } set.clear(); } scanner.close(); } }TreeSet即可解决去重加排序的目的
#include<iostream> using namespace std; short handle(short*arr,short start,short end){ while(start<end){ while(start<end&&arr[start]<=arr[end])--end; short tmp=arr[start]; arr[start]=arr[end]; arr[end]=tmp; while(start<end&&arr[start]<=arr[end])++start; tmp=arr[start]; arr[start]=arr[end]; arr[end]=tmp; } return start; } void quick_sort(short *arr,short start,short end){ if(start>=end)return; short tmp=handle(arr,start,end); quick_sort(arr,start,tmp-1); quick_sort(arr,tmp+1,end); } int main(){ short n; while(cin>>n){ short end=n-1,tmp; short arr[n]; while(n>0&&cin>>tmp){ arr[end+1-n]=tmp; --n; } quick_sort(arr,0,end); int i=0,j=1; cout<<arr[0]<<endl; for(;j<=end;++i,++j) if(arr[i]!=arr[j])cout<<arr[j]<<endl; } }
看到一些同学的方法很巧妙,这里提供一个直接干的蠢办法: 先使用动态数组储存输入,然后快速排序,最后去重。 #include <iostream> using namespace std; int partition(int* inputArray,int lo, int hi) ; void quicksort(int *inputArray,int lo, int hi) //快速排序 迭代形式 { if (hi - lo<2) return; int mi = partition(inputArray,lo, hi- 1); quicksort(inputArray,lo, mi); quicksort(inputArray,mi + 1, hi); } int partition(int* inputArray,int lo, int hi) { //轴点构造算法 int pivot = inputArray[lo]; while (lo<hi) { while ((lo<hi) && (pivot <= inputArray[hi])) hi--; inputArray[lo] = inputArray[hi]; while ((lo<hi) && (pivot>= inputArray[lo])) lo++; inputArray[hi] = inputArray[lo]; } inputArray[lo] = pivot; return lo; } void remove(int *inputArray,int N){ //去重 for(int i=1;i<N;i++) if (inputArray[i-1]==inputArray[i]) inputArray[i-1]=0; } int main() { int N; while(cin>>N){ int *inputArray=new int[N]; for(int i=0;i<N;i++) cin>>inputArray[i]; quicksort(inputArray,0,N); remove(inputArray,N); for(int i=0;i<N;i++) if(inputArray[i]) cout<<inputArray[i]<<endl; } }
//再次感受到sort函数的厉害之处 #include<iostream> #include<algorithm> using namespace std; int main(){ int n; while(cin>>n){ int* a=new int[n]; for(int i=0;i<n;i++) cin>>a[i]; sort(a,a+n); cout<<a[0]<<endl; for(int i=1;i<n;i++) if(a[i]!=a[i-1]) cout<<a[i]<<endl; } return 0; }
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int N; while (cin >> N) { vector<int> array; int num; for (int i = 0; i < N; ++i) { cin >> num; array.push_back(num); } sort(array.begin(), array.end()); vector<int>::iterator duplicated = unique(array.begin(), array.end()); array.erase(duplicated, array.end()); for (auto it : array) { cout << it << endl; } } return 0; }
//此方法只能输入一行输出一行 /*#include <iostream> #include <vector> using namespace std; int main() { int n; int num; vector<int> vec(1000,0); cin>>n; for(int i=0;i<n;i++) { cin>>num; vec[num]++; } for(int i=0;i<1000;++i) { if(vec[i]>0) cout<<i<<endl; } return 0; }*/ #include <iostream> #include<vector> using namespace std; int main() { //输入多行 输出多行 //这个问题的表述本身有问题,它的测试数据不止有一组,很多朋友估计是因为这个原因一直没有通过 int n;//输入的随机数的个数 int num; // vector<int> vec(1000,0); while(cin>>n) { vector<int> vec(1000,0); for(int i=0;i<n;++i) { cin>>num; vec[num]++; } for(int i=0;i<1000;++i) { if(vec[i]>0) cout<<i<<endl; } } return 0; }