zoukankan      html  css  js  c++  java
  • 成绩查询(哈希函数)

    ★实验任务

    录入 n 个学生的成绩,并查询。

    ★数据输入

    第一行输入包括 n、m(1<=n<=50,000,1<=m<=100,000)两个数字。
    接下来 n 行,每行包含名字和成绩,名字用字符串表示,长度不超过 4.成绩为不 超过 100 的非负整数,名字仅由小写字母组成。
    接下来 m 行,每行包括一个名字。

    ★数据输出

    输出 m 行,如果查询的学生不存在,输出”not,exist!”,否则输出学生的成绩。

    解题思路:因为之前看到这题首先想的就是直接用STl中的map就可以实现(根本就没想不能全AC),就没有深入想怎么用哈希函数实现。之后就看了一下同学的评优代码,我选择了一份感觉比较简短的代码,就是直接通过对字符串不同位置进行ASCII码转换的一个哈希函数。

    代码:

     
                #include<stdio.h>
    #include<cmath>
    #include<iostream>
    #include<string>
    
    using namespace std;
    int a[500001];
    int main()
    {
    	int i, n, m, x, j, sum, len;
    	string s;
    	memset(a, -1, sizeof(a));
    	cin >> n >> m;
    	for (i = 1; i <= n; i++)
    	{
    		cin >> s >> x;
    		len = s.length();
    		sum = s[0] - 'a' + 1;
    		for (j = 1; j<len; j++)
    		{
    			sum = sum * 26 + (s[j] - 'a' + 1);
    		}
    		a[sum] = x;
    	}
    	for (i = 1; i <= m; i++)
    	{
    		cin >> s;
    		len = s.length();
    		sum = s[0] - 'a' + 1;
    		for (j = 1; j<len; j++)
    		{
    			sum = sum * 26 + (s[j] - 'a' + 1);
    		}
    		if (a[sum] >= 0)
    			printf("%d
    ", a[sum]);
    		else
    			printf("not,exist!
    ");
    	}
    
    	return 0;
    }
            
    

    其实通这题的哈希函数仔细一想还是比较容易想出来的,但是因为图方便我就没有多加思考,也没有深究map消耗时间等等的细节,以后还需要加以改正;

  • 相关阅读:
    1.打开windows中功能的快捷方式
    16-SQLServer强制走索引
    15-资源等待类型sys.dm_os_wait_stats
    14-SQLServer索引碎片
    13-修复数据库,表,索引
    12-SSMS图形化工具中不允许保存修改的解决办法
    11-常用SQL总结
    10-SQLServer中统计信息的使用
    Java连接mysql数据库
    递归方式的对变量中的特殊字符进行转义/去除转义
  • 原文地址:https://www.cnblogs.com/heihuifei/p/7868210.html
Copyright © 2011-2022 走看看