`
mfkvfn
  • 浏览: 17898 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

给定一个字符串,如果快速得到另一个hashCode相同的最短字符串

 
阅读更多

因为java.lang.Object中的hashCode()方法返回类型是in。其范围为 -231 ~ 231 -1。

Java中用UTF编码,字符长度16位,即大约有216 个字符。长度为2个字符串就有232 个。等于int的范围。

根据抽屉原理:

  • 有一个长度为3的字符串,一定存在另一个长度≤3的字符串,它们的hashCode相等。
  • 任何一个字符串,一定存在很多个与它的hashCode相等的字符串。比如"一一一一一一一一一"和“侏丝丈业”的hashCode都是626609664。

那么有2个算法题:

  1. 题目1:给定任意一个字符串,求与它的hashCode相等的最短字符串(短的意思是说如果a比b短,意味着 a.length()<b.length() || (a.length()==b,length() && a.compareTo(b)<0) )。
  2. 题目2:给定任意一个int值,求hashCode等于此int值的最短字符串(短的意思同上)。

 

先记下,什么时候有空写个算法研究一下。

几点思考:

     1       String类中hashCode要多次用到31^n次这个。可以先用全局静态量记住。如

                               int[] POW31={1,31,961,29791,923521,...};

              这样31^n = POW31[n]就可以了。

     2       如果不考虑int的符号(即当作无符号整数),hashCode会在一定范围内随着字符串增加而增加。即存在区间的概念,可以通过区间段快速定位。这样给定一个hashCode的int值时,可以快速定位到一个区间(即可以大致猜出如果长度为2时,它的第一字符一定在某个范围内,比如['A','z'])。

     3       从hashCode求字符串的过程有点类似于把一个10进制的int值转换为31进制。所不同的是31进制的每位一定是[0,30]的整数,而hashCode的每位可能是[0,65535]。也就是说如果转换为31进制后第一个不为0的最高位是 x(1<=x<=30),则结果字符串的首位可能是 x、x*31、x*31*31、x*31*31*31、...这些可能值中的一个(前提条件是那些可能值必须小于65536)。

 

另外附java.lang.String中hashCode()的算法。

public int hashCode()
返回此字符串的哈希码。String 对象的哈希码按下列公式计算: 
           s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用 int 算法,这里 s[i] 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。(空字符串的哈希码为 0。) 
分享到:
评论

相关推荐

    Java中String类的方法及说明.doc

    否则,返回第一个不相等字符的Unicode值的差,或者返回字符串长度的差,如果一个字符串比另一个短。 - `compareTo(Object o)`: 如果o是一个String对象,这个方法的行为与`compareTo(String anotherString)`相同;...

    string类的常用方法.pdf

    - **返回**: 字符串池中的字符串,如果当前字符串已经存在于池中,则返回同一个引用;否则返回当前字符串的一个规范化版本并将其添加到池中。 #### 21. `int lastIndexOf(int ch)` - **描述**: 返回指定字符最后一...

    javascript中实现兼容JAVA的hashCode算法代码分享

    Java中String类的hashCode方法采用特定的算法,即:初始时,哈希码值为0,然后以字符为单位,对于字符串中的每一个字符,都使用31乘以当前哈希码,然后加上当前字符的ASCII值,然后更新哈希码。 2. **JavaScript中...

    String方法使用例子

    - `compareTo()`:基于Unicode值比较字符串,返回值表示当前字符串与另一个字符串的相对顺序。 3. **字符串长度** - `length()`:返回字符串的长度,即字符数量。 4. **获取子串** - `substring(int beginIndex...

    JAVA中常用类的常用方法.docx

    - **功能**:将此字符串与另一个字符串比较,不考虑大小写。 - **注意事项**: - 如果两个字符串的字符完全相同(忽略大小写),则返回 `true`。 - **indexOf(int ch)** - **功能**:返回指定字符在此字符串中...

    JAVA中字符-字符串常用的方法.doc

    - **返回值**: 如果当前对象小于、等于或大于另一个对象,则分别返回负整数、零或正整数。 ##### 12. `static int digit(char ch, int radix)` - **功能**: 返回使用指定基数的字符`ch`的数值。 - **参数**: - `ch...

    JAVA【第5章:面向对象基础】_String类的常用方法.rar

    - `compareTo(String anotherString)`:根据字典顺序比较两个字符串,返回负数、零或正数表示当前字符串小于、等于或大于另一个字符串。 - `compareToIgnoreCase(String anotherString)`:忽略大小写进行比较。 ...

    关于String类的一些方法

    - `concat(String str)`:将给定字符串连接到此字符串的末尾。 - `StringBuilder.append(String str)`:使用`StringBuilder`或`StringBuffer`可以更高效地连接多个字符串。 5. **查找与替换**: - `indexOf...

    JAVA中常用类的常用方法.pdf

    - replace(char oldChar, char newChar):返回一个新字符串,它是通过用newChar替换此字符串中出现的所有oldChar得到的。 - startsWith(String prefix):判断此字符串是否以指定的前缀开始。 - substring(int ...

    达内11年java 资料正则表达式

    - **split(String regex)**:按照给定的正则表达式分割此字符串,返回一个字符串数组。 理解字符串的不可变性和各种操作方法,对于高效处理文本数据至关重要。 ### 案例:扑克牌(Card) 这个案例涉及到数组、...

    java源码分析

    1. hashCode()方法是一个本地(native)方法,它返回对象的哈希码,用于在哈希表中快速查找对象。不同对象的哈希码通常不同,但如果两个对象通过equals()方法比较是相等的,则它们的hashCode()方法返回的哈希码也应...

    java面试笔试大全

    `),会检查字符串池中是否存在相同的字符串,如果存在则直接引用已有的字符串,否则会在字符串池中创建一个新的字符串。 - **new String()**:通过`new String()`创建字符串时,会在堆中创建一个新对象,并将其引用...

    面试题总结.docx

    反转字符串可以通过多种方法实现,如使用`StringBuilder`的`reverse()`方法,或者创建一个新的字符数组,从原字符串的末尾开始遍历并复制到新数组的前面。例如: ```java String str = "hello"; StringBuilder ...

    java中的hashCode方法小例子

    而`str3`的哈希码与`str1`和`str2`不同,因为它指向的是另一个字符串常量。 值得注意的是,`hashCode()`的实现取决于对象的类型。对于`String`类,`hashCode()`是基于字符串的字符序列计算出来的。在不同的JVM或...

    TripAdvisor常考面经总结

    27. 编写一个函数,以最节省内存的方式反转字符串。 28. 对于奇数长度的字符串,如果将其中间的字符移动到开始位置会发生什么。 29. 在Python中,什么是不可变(immutable)字符串和可变(mutable)字符串。 30. ...

    char,string全部函数方法说明

    `split(String regex)`方法根据正则表达式分割字符串,返回一个字符串数组。`toLowerCase()`和`toUpperCase()`将字符串转换为小写或大写。`trim()`去除字符串两端的空白字符。`replace(char oldChar, char newChar)`...

    src02 Integer

    14. **Integer.getInteger(String nm, Integer val)**: 这个静态方法根据给定的字符串`nm`解析一个整数。如果解析失败,它返回默认值`val`。这个方法通常用于配置文件中的值解析。 15. **Integer.decode(String nm)...

    java相关知识

    5. **`replace(int start, int end, String str)`**:用另一个字符串替换指定位置的子字符串。 6. **`toString()`**:返回当前对象的字符串表示形式。 #### 三、数学运算类 `Math` `Math` 类提供了基本的数学函数...

    PhpCommons:一些常见PHP方法

    hashCode获取给定字符串的基于整数的哈希码 大批 insertElement在给定位置将元素添加到数组中,而不替换旧条目 removeElementByValue从数组中删除给定的元素 mergeArrayValues从两个给定的数组创建一个数组。 ...

Global site tag (gtag.js) - Google Analytics