• 成绩查询(哈希函数)


    ★实验任务

    录入 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消耗时间等等的细节,以后还需要加以改正;

  • 相关阅读:
    html+vue.js 实现分页可兼容IE
    Display、Visibility 和 Opacity 的区别
    Vue项目刷新页面 IE/360 浏览器 input输入框不清空问题处理
    Webpack入门
    linux下Tomcat日志文件catalina.out的切割
    无监控,不运维
    windows与linux下jdk+tomcat安裝
    java面向对象(提高篇)
    java面向对象(汇总)
    JAVA工程师简历模板
  • 原文地址:https://www.cnblogs.com/heihuifei/p/7868210.html
Copyright © 2020-2023  润新知