`

Nickname

 
阅读更多
Description

ZSUQ Messenger is similar with Tencent QQ. Each user will make a nickname for itself. Different users can have identical nickname. Some common ones, such as “Tom”, “Marry”, “Kate”, are frequently used. In a recent survey, the ZSUQ Company was astonished to find that there are no more than 5000 distinct nicknames that are being used.
       Being a member of the ZSUQ Company, you are asked to make a report, telling the number of users for each nick name. A complete list of all users’ nicknames is provided to you. Please note that nicknames are case insensitive.
Input
The first line of the file contains an integer indicating the number of test cases.
In each test case, there is an integer N in the first line (0 < N < 100,000). The following N lines describe N users’ nicknames. Each name consists of no more than 100 characters. There is a bland line between two cases.
Output
For each case, give out a list of the distinct nickname, one per line, followed by a bland space and the number of users who has this nickname. The names are in alphabetic order. There is no bland space at the beginning or the end of each line. Nicknames should be presented in lowercase letter. There is a bland line after each case.

 

题目:一组个数为N(<=100,000)的昵称,其中有大量的重复(总共昵称才不足5000个),要求求出每个昵称的个数。附加信息:昵称不分大小写,按照字典升序输出,昵称长度不超过100(记为L)。

 

解析:将昵称转换小写后,先快排,(O(Lnlongn)),再扫描一次重复的,(O(Ln))。

但这样虽然简单却复杂度较高。如果用hash,把字符串当作26进制数,求hash值(O(L)),用线性开放地址法解决hash冲突。这样做,复杂度复杂度为O(Ln)。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const int maxCount=6000;    //hash表的最大槽数

typedef struct {
    char * name;
    int count;
}Student;

//比较大小的接口,用于qsort
int cmp(const void* s1,const void* s2){
    Student *ss1=(Student *)s1;
    Student *ss2=(Student *)s2;
    return strcmp(ss1->name,ss2->name);
}

//生成hash值
int hash(char* str){
    int result=0;
    for(char* p=str;*p!=0;p++){
          result=result*26+(*p)-96;
    }
    return result%maxCount;
}

//转换成小写
char *toLower(char *s){
    char *p;
    for (p=s; *p; p++){
        if (*p >= 'A' && *p <= 'Z')
            *p = *p - 'A' + 'a';
    }
    return s;
}

 Student hashTable[maxCount];
int main(){
   FILE *input=fopen("nickname.in","r");
   FILE *output=fopen("nickname.out","w");
   int n,nickNum;  //nickNum用来记录不重复昵称个数
   int testcase,index;
   char str1[100],str2[100];
  
   for( fscanf(input,"%d",&testcase);testcase>0;testcase--){
        memset(hashTable,0,sizeof(hashTable));
        fscanf(input,"%d",&n); //每一组测试的组数
        for(int i=0;i<n;i++){  //n个昵称
             fscanf(input,"%s",str1);
             strcpy(str2,toLower(str1));
             index=hash(str2);
             //定位应该插入的位置
             while(hashTable[index].name!=NULL&&strcmp(hashTable[index].name,str2)!=0){  //hash冲突
                   index++;
                   if(index>=maxCount)
                        index=0;
              }  
               if(hashTable[index].name==NULL){ //第一次插入
                  hashTable[index].name=new char[strlen(str2)+1];
                  strcpy( hashTable[index].name,str2);
                  hashTable[index].count=1;   
             }else{  //非第一次插入
                  hashTable[index].count++;   
             }
         }
          //将数据前移,然后排序输出
         nickNum=0;
         for(int i=0;i<maxCount;i++){
              if(hashTable[i].count!=0){ 
				  hashTable[nickNum++]=hashTable[i];
				  }
           }       
         qsort(hashTable,nickNum,sizeof(Student),cmp); 
         for(int i=0;i<nickNum;i++){
              fprintf(output,"%s %d\n",hashTable[i].name,hashTable[i].count);
         } 
          fprintf(output,"\n");
    }
    return 0;
}

 输入:

3
3
hello
oh
oh

2
shit
shit

9
hello
put
abs
abs
put
hello
tte
hello
put

 

输出:

hello 1
oh 2

shit 2

abs 2
hello 3
put 3
tte 1

分享到:
评论

相关推荐

    DB2创建NickName

    在DB2数据库系统中,NickName(昵称)是一种非常重要的概念,特别是在处理跨数据库查询时。NickName允许用户在不直接引用远程数据库的情况下,通过本地数据库访问远程数据,这在分布式数据库环境中尤为实用。本篇...

    liaotianshi.rar_Java 8_java nickname_liaotianshi

    客户端的实现效果  1.登录服务器,如果服务器端口号和IP号输入的字符都是"0"则,客户端连接到...检查用户名 :checkNickName(String nickName)  8.获得帮助列表:helpList();  9.各项内容的输入在main方法中进行

    SpringBoot+mybatis基于注解式增删改查框架源码程序

    int insertParam(@Param("nickName") String nickName, @Param("userCode") String userCode); @Insert("INSERT INTO USER(nick_name, user_code) VALUES(#{nickName,jdbcType=VARCHAR}, #{userCode,jdbcType=...

    Chinese-NickName-for-Sketch:用于草图的中文昵称生成插件

    《Chinese-NickName-for-Sketch:草图设计中的中文昵称生成插件详解》 在数字设计领域,Sketch是一款广泛使用的矢量图形编辑软件,尤其受到UI/UX设计师的青睐。为了提升设计效率和用户体验,许多插件应运而生,其中...

    微信源码,在线看电影源码

    $nickname = $userInfo['nickname'];//获取昵称 $sex = $userInfo['sex']; //获取性别 $city = $userInfo['city'];//获取用户所在城市 $headimgurl = $userInfo['headimgurl'];//获取用户头像 ...

    php获取微信code.openid.名字和头像

    $nickname = $userinfo['nickname']; $headimgurl = $userinfo['headimgurl']; ``` 现在,你已经成功地获取到了微信用户的code、openid、名字(nickname)和头像URL(headimgurl)。这些信息可以存储在你的...

    Nickname:简单的SpigotBukkit插件可添加昵称

    /nick &lt;nickname&gt; [player]设置您自己的昵称,可选的玩家参数来设置另一个玩家的昵称。 权限 nickname.use允许使用/nick 。 默认为所有用户。 nickname.color允许使用Nicks中的颜色。 默认为OP。 nickname.others...

    discord-script-nickname-upd:每3秒更新一次不和称昵称的脚本

    nickname = "YOUR_NICKNAME" ; // Enter your nickname here im_admin = 1 ; // 1 == YES, 0 == NO 打开并打开正确的服务器 打开控制台(F12),然后在脚本上方按Enter键。 暂时不要关闭页面。 例子:

    pingpong-nickname:一个npm包,给一个很棒的乒乓球昵称

    var PingPongNickname = require('pingpong-nickname'); var pingPongNickname = new PingPongNickname({host:'yourhost.com',port:3000,protocol:'http'},{auth:{user:'user',pass:'pass',...

    Incorrect string value: ‘\xF0\x9F\x8C\xB7’ for column ‘nickname’修改mysql某列的编码格式

    Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x8C\xB7' for column 'nickname' at row 1 解决方案 修改nickname的编码格式,没必要修改整个表。这种方式也不需要重启数据库,修改完即生效 ...

    nickname-and-diminutive-names-lookup:包含美国给定名称(名字)及其关联昵称或小名的CSV文件

    昵称和小名查找包含美国给定名称(名字)及其关联昵称或小名的CSV文件。 此查找文件最初是通过挖掘此创建的。 由于查找是基于用于家谱分析的数据集,因此有些旧名称最近很少使用,但也有最近使用的名称。...

    2021-2022年收藏的精品资料软件工程师Java代码开发七个规范教程说明.docx

    public void setNickname(String nickname) { this.nickname = nickname; } public boolean isActive() { return active; } public String getNickname() { return nickname; } ``` - **目的**:遵循Java Bean...

    mysql对表的修改,复制与删除.pdf

    CREATE TABLE new_nickname SELECT * FROM nickname; ``` 这条语句将创建一个完全和原表结构一样、数据也一样的新表 new_nickname。 如果我们只需要复制特定字段的表副本,可以使用以下语句: ```sql CREATE ...

    mysql对表的修改,复制与删除知识.pdf

    这条语句将创建一个名为 new_nickname 的表,表结构和数据都与原表 nickname 相同。 2. 创建只包含特定字段的表副本 如果我们只需要某些字段,可以使用以下语句: create table new_nickname select name, desc ...

    java_msn.rar_The P.I_listener_mp3 plugin

    JMSN Auto Nickname Changer plugins support only winamp 2.x version. [StartUp] In Tools -&gt; Options.. -&gt; Auto Nickname tabs, Configure your prefix and postfix besides your mp3 name And Press ...

    mysql对表的修改,复制与删除.docx

    create table new_nickname select * from nickname; ``` * 复制特定字段:如果我们只需要复制原表的部分字段,可以使用以下语句: ``` create table new_nickname select name, desc from nickname; ``` * 复制...

    JavaWeb百度贴吧帖子论坛上传下载基本实现

    UNIQUE KEY `nickname_UNIQUE` (`nickname`) ); CREATE TABLE `tieba` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(100) NOT NULL, `content` varchar(600) NOT NULL, `name` varchar(18) NOT...

    android取到通讯录中昵称的方法

    如果条件满足,我们将遍历Cursor中的每一行数据,将读取到的昵称和显示名称分别通过nickName.setNickName和nickName.setPeopleName方法保存到nickName对象中,然后将nickName对象添加到list列表中。 最后,我们返回...

    SQLSERVER试题

    这条SQL语句选取了Users表中BloodID字段值为'00'(代表O型血)的用户,返回他们的昵称(NickName)和性别(Sex)。 2. 使用交叉连接查询,查询出血型为“A型”并且星座为“白羊座”的用户姓名和性别: ```sql ...

Global site tag (gtag.js) - Google Analytics