function getHash( string ) {
let h = 7, letters = "acdefhlmnoprstuw";
for( var i = 0; i < string.length; i++ ) {
h = ( h * 37 + letters.indexOf( string[ i ] ) );
}
return h;
}
我的任务是编写一段代码,查找包含以下字母的字符串:ACDEFHLMNOPRSTUW
因此,函数getHash(搜索字符串(得到18794359164的结果。
我不会给你一些代码,只是一些提示。
为了理解代码,你有,你想得到的是,带上一个字符串,从中得到一个哈希值
例如,取'wonder'
并获取
19017519751
作为散列值。
该值包含一个起始值7(h = 7
(,对于每个字母,它将h
与37
相乘(该值看起来像是为37个不同的字符创建的(,并将letters
的索引值相加。
要获得与数值相反的结果,您需要用37
将除法的剩余部分分开,以获得字母的索引,与使用字母完全相反,并向哈希中添加一个值。
例如,取上面的值19017519751
,并通过37
得到除法的剩余部分
19017519751 % 37 -> 11 r
现在有了最后一个字母(记住,编码从单词的开头到结尾,解码从结尾开始(,您需要得到一个没有最后一个字符的值。
通过编码,您将最后一个和乘以37,这在这里也适用,但以相反的方式,您需要一个整数值。只需除以37
,取下一个字母的底值。
剩下的看起来是这样的:
513987020 % 37 -> 3 e
13891541 % 37 -> 2 d
375447 % 37 -> 8 n
10147 % 37 -> 9 o
274 % 37 -> 15 w
最后,您需要进行检查以停止迭代,因为此值是编码的第一个值7
。