一位前辈发给我一道算法题,这里整理一下自己的解题思路。
请设计一种处理算法能高效的检查出字符串中第一次出现的重复字符。给定的字符串长度小于等于500个字符,包含字母、数字、英文符号。

查找第一次出现的重复字符...
考察:在字符数组中如何快速的查找某个字符。
知识:
/**
* 常规的查找第一个重复字符串的方法
* @return 当字符串为空时,返回null
*/
public static Character normalFind(String str){
if (str == null || "".equals(str)) {
return null;
}
if (str.length() > 500){
//日志,根据文档,判断是否处理大字符串
System.out.println("warn 输入的字符长度过大");
}
for (int i = 1; i 依次遍历每个字符,遍历过的字符进行hashCode,字符的hashCode为自身代表的int值,hashCode与数组容量求余,将字符再以链表的形式存在数组中,如果其它字符的求出的下标重复,将当前节点加入到链表的最后节点。
static class Node {
/**
* 存放下个节点
*/
Node next;
/**
* 存放当前节点的值
*/
int value;
public Node() {
}
public Node(Node next, int value) {
this.next = next;
this.value = value;
}
}
public static Character myFind(String str, Integer capacity) {
if (str == null || "".equals(str)) {
return null;
}
if (str.length() > 500) {
//日志,根据说明判断是否处理
System.out.println("warn 输入的字符长度过大");
}
if (str.length() = 500){
capacity = 500;
}
Node[] chars = new Node[capacity];
for (int i = 0; i 如果待查找的字符数组中不存在字符,就加入新的字符,如果存在字符就返回当前字符
public static Character setFind(String str) {
if (str == null || "".equals(str)) {
return null;
}
if (str.length() > 500) {
//日志,根据说明判断是否处理
System.out.println("warn 输入的字符长度过大");
}
HashSet hashSet = new HashSet();
for (int i = 0; i 测试代码如下:
/**
* 1. 字符类型为数字,字母,特殊字符
* 2. 数组时连续的内存空间,可以直接根据下标来查找元素
* 3. 计算机对数字比对字符敏感,因此字符的存储采用数字形式
*/
public static void main(String[] args) {
if (args.length == 0) {
System.out.println("请在运行时输入字符串");
return;
}
for (int i = 0; i javac me/aihe/exam/FindFirstRepeatdChar.java 运行程序:
暂时只用了两个长度的字符串测试,可以多运行几次查看效果, 一般耗时和字符串的长度与指定的数组容量有关。
最近越来越意识到算法的重要性,也在恶补中,稳扎稳打,希望能早日实现目标。
完整代码:
package me.aihe.exam;
import java.math.BigDecimal;
import java.util.HashSet;
/**
* @author aihe 2018/6/27
*/
public class FindFirstRepeatdChar {
static class Node {
/**
* 存放下个节点
*/
Node next;
/**
* 存放当前节点的值
*/
int value;
public Node() {
}
public Node(Node next, int value) {
this.next = next;
this.value = value;
}
}
/**
* 普通的查找第一个重复字符串的方法
*
* @return
*/
public static Character normalFind(String str) {
if (str == null || "".equals(str)) {
return null;
}
if (str.length() > 500) {
//日志,根据说明判断是否处理
System.out.println("warn 输入的字符长度过大");
}
//从第一个下标开始找
for (int i = 1; i 500) {
//日志,根据说明判断是否处理
System.out.println("warn 输入的字符长度过大");
}
if (str.length() = 500){
capacity = 500;
}
Node[] chars = new Node[capacity];
for (int i = 0; i 500) {
//日志,根据说明判断是否处理
System.out.println("warn 输入的字符长度过大");
}
if (capacity == null){
capacity = 16;
}
if (capacity >= 500){
capacity = 500;
}
HashSet hashSet = new HashSet(capacity);
for (int i = 0; i ?[]{}交换代码由学会制定单符编方案基文本数据。起始于后期年最初是美家供不同计算机在相互通信时用作共遵守的西字它已被国际标准化组织定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母";
if (args.length == 0) {
System.out.println("请在运行时输入字符串");
return;
}
for (int i = 0; i 来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1747/viewspace-2803354/ ,如需转载,请注明出处,否则将追究法律责任。