hlg1287数字去重和排序II【hash】

大意:

告诉你n个数让你把其中重复的数字保留一个并且排序输出

分析:

每读入一个数若未出现过就把这个数存起来

昨天re无数次原因是输出的时候我是先输出的第一个然后把每个依次输出

这就有一个问题就是如果只有一个元素的还要访问第一个元素从而造成re

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6
 7 const int maxn = 5000007;
 8
 9 struct Node {
10     int d;
11     Node *next;
12 };
13 Node *head[maxn + 10];
14 Node num[maxn + 10];
15 int ans[maxn];
16
17 int main() {
18     int n;
19     int d;
20     while(EOF != scanf("%d",&n) ) {
21         memset(head, 0, sizeof(head));
22         int tot = 1;
23         int cnt = 0;
24         for(int i = 1; i <= n; i++) {
25             scanf("%d",&d);
26             bool flag = true;
27             int c = d % maxn;
28             Node *pt = head[c];
29             while(pt) {
30                 if(pt -> d == d) {
31                     flag = false;
32                     break;
33                 }
34                 pt = pt -> next;
35             }
36             if(flag) {
37                 ans[cnt++] = d;
38                 num[tot].d = d;
39                 num[tot].next = head[c];
40                 head[c] = &num[tot++];
41             }
42         }
43         sort(ans, ans + cnt);
44         printf("%d\n", cnt);
45         printf("%d", ans[0]
46         for(int i = 0; i < cnt; i++) {
47             printf(i == 0 ? "%d" : " %d", ans[i]);
48         }
49         puts("");
50     }
51     return 0;
52 }

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6
 7 const int maxn = 5000007;
 8
 9 struct Node {
10     int to;
11     int next;
12 }e[maxn + 10];
13
14 int head[maxn + 10];
15 int tot;
16
17 bool Find(int u, int v) {
18     for(int i = head[u]; i; i = e[i].next) {
19         if(e[i].to == v) {
20             return true;
21         }
22     }
23     e[tot].to = v;
24     e[tot].next = head[u];
25     head[u] = tot++;
26     return false;
27 }
28
29 int ans[maxn];
30
31 int main() {
32     int n;
33     int d;
34     while(EOF != scanf("%d",&n) ) {
35         int cnt = 0;
36         memset(head, 0, sizeof(head));
37         tot = 1;
38         for(int i = 1; i <= n; i++) {
39             scanf("%d",&d);
40             int c = d % maxn;
41             if(!Find(c, d)) {
42                 ans[cnt++] = d;
43             }
44         }
45         sort(ans, ans + cnt);
46         printf("%d\n",cnt);
47         if(cnt != 0) printf("%d", ans[0]);
48         for(int i = 1; i < cnt; i++) {
49             printf(" %d",ans[i]);
50         }
51         puts("");
52     }
53     return 0;
54 }

数组模拟

时间: 2024-08-04 11:35:41

hlg1287数字去重和排序II【hash】的相关文章

哈理工oj Hrbustacm 1287 数字去重和排序II(STL 或着 hash 拉链法)

水题 STL map也能过,但是为了练习拉链hash /*============================================================================= # # Author: liangshu - cbam # # QQ : 756029571 # # School : 哈尔滨理工大学 # # Last modified: 2015-08-26 18:36 # # Filename: C.cpp # # Description: #

经典算法题-数字去重与排序

现有N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号.然后再把这些数从小到大排序 Python实现方式如下 while True: try: a = int(input()) res = set() for i in range(a): res.add(int(input())) for i in sorted(res): print(i) except: break 原文地址:https://www.cnblog

数组去重及排序/0~10随机数字/字符串中出现最多的字符及次数

数组去重及排序: var arr = [1,5,1,2,6,8,1,81,9,0]; for(var i=0;i<arr.length;i++){ for(var j=i+1;j<arr.length;j++){ if(arr[i] == arr[j]){ arr.splice(j,1); j--; } } } arr.sort(function(a,b){ return a-b; // 从小到大排序 }) alert(arr); // 0,1,2,5,6,8,9,81 arr.sort(fu

11:去重并排序

11:题目描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号.然后再把这些数从小到大排序,按照排好的顺序去找同学做调查.请你协助明明完成“去重”与“排序”的工作. Input Param n               输入随机数的个数 inputArray      n个随机整数组成的数组 Return Value OutputA

华为往年笔试题【去重和排序】【vertor二维数组,迭代器】

题目:明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号.然后再把这些数从小到大排序,按照排好的顺序去找同学做调查.请你协助明明完成“去重”与“排序”的工作(同一个测试用例里可能会有多组数据,希望大家能正确处理). Input Param n               输入随机数的个数 inputArray      n个随机整数组成的

数组的合并,去重,排序

一,两个数组的合并去重: var arr1 = ['a','b']; var arr2 = ['a','c','d']; var arr3 = [1,'d',undefined,true,null]; //合并两个数组,去重 var concat_ = function(arr1,arr2){ //不要直接使用var arr = arr1,这样arr只是arr1的一个引用,两者的修改会互相影响 var arr = arr1.concat(); //或者使用slice()复制,var arr =

对数据库表中的某一字段去重分组排序

1.问题背景    某数据库t_tab_ab中有两个字段a和b,如下所示:    查询前:                 查询后:    a     b                  a     b    1     2                  1     2    1     3                  2     3    1     4                  3     4    1     5    2     3    2     4    2  

字符串去重并排序

1. 一个简单的去除字符串中字符重复,并排序的算法 void remove_replace (char *str) { /* pos 是构造新字符串时的当前位置 */ int i, pos = 0; unsigned char buf[256] = {0}; for (i = 0; str[i]; i++) { if (1 == (buf[str[i]] += 1)) str[pos++] = str[i]; } memset (str+pos, 0, strlen (str)); } 字符串去

数组去重统计排序

需求是:统计次数并按照要求排序: 思路: 第一步:拼接字符串,返回一个字符串数组: 第二步 :查询数组,去重并统计次数: 第三步:使用sort()函数进行排序: 第四步:join()函数.把数组元素放到字符串中,的确很绕,学程序的没办法,多练习. <!doctype html> <html> <head> <meta charset="utf-8"> <title>数组去重统计排序</title> <styl