package com.lance.algorithm.算法;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Sanlie {
private static Sanlie instance = new Sanlie();
private Sanlie() {
};
public static Sanlie getInstance() {
return instance;
}
public static void main(String[] args) {
Sanlie instance = Sanlie.getInstance();
String[] str1 = new String[] { "11", "3", "3", "3" };
String[] str2 = new String[] { "3" };
List<Result> result = instance.doSanlie(str1, str2);
// List<Result> result = instance.doSanlie(str1);
for (Result resultValue : result) {
System.out.println(resultValue.getIndex() + " "
+ resultValue.getValue());
}
}
/**
* 获取两个数组中相同的字符
*
* @param str1
* str1
* @param str2
* str2
* @return List<String>
*/
public List<Result> doSanlie(String[] str1, String[] str2) {
List<Result> result = new ArrayList<Result>();
int max = str1.length > str2.length ? str1.length : str2.length;
int min = str1.length < str2.length ? str1.length : str2.length;
int[][] cache = new int[max * min][];
for (String str1Value : str1) {
int hash = hash(str1Value.hashCode());
int index = index(hash, max * min);
if (cache[index] == null) {
cache[index] = new int[1];
} else {
cache[index] = Arrays.copyOf(cache[index],
cache[index].length + 1);
}
for (int j = 0; j < cache[index].length; j++) {
if (cache[index][j] == 0) {
cache[index][j] = hash;
break;
}
}
}
for (int i = 0; i < str2.length; i++) {
int hash = instance.hash(str2[i].hashCode());
int index = instance.index(hash, max * min);
if (cache[index] != null) {
for (int j = 0; j < cache[index].length; j++) {
if (cache[index][j] == hash) {
Result repReault = new Result();
repReault.setIndex(i + 1);
repReault.setValue(str2[i]);
result.add(repReault);
break;
}
}
}
}
return result;
}
/**
* 查找数组中重复的字符
*
* @param str1
* @return
*/
private List<Result> doSanlie(String[] str1) {
List<Result> result = new ArrayList<Result>();
int max = str1.length;
int[][] cache = new int[max * max][];
for (int i = 0; i < str1.length; i++) {
int hash = hash(str1[i].hashCode());
int index = index(hash, max * max);
if (cache[index] == null) {
cache[index] = new int[1];
} else {
cache[index] = Arrays.copyOf(cache[index],
cache[index].length + 1);
}
for (int j = 0; j < cache[index].length; j++) {
if (cache[index][j] == 0) {
cache[index][j] = hash;
break;
} else if (cache[index][j] == hash) {
Result repReault = new Result();
repReault.setIndex(i + 1);
repReault.setValue(str1[i]);
result.add(repReault);
break;
}
}
}
return result;
}
/**
* 这个地方是重点
*
* @param hashCode
* hashCode
* @return
*/
private int hash(int hashCode) {
hashCode ^= (hashCode >>> 20) ^ (hashCode >>> 12);
return hashCode ^ (hashCode >>> 7) ^ (hashCode >>> 4);
}
private int index(int hash, int length) {
return hash & (length - 1);
}
class Result {
private int index;
private String value;
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
}
分享到:
相关推荐
《Java数据结构和算法》第二版是一本深入探讨如何在Java编程环境中应用数据结构和算法的书籍。数据结构是组织和存储数据的方式,而算法则是解决问题的步骤或指令集。这本书针对Java程序员,旨在提高他们对这两方面...
在Java版本中,我们通常会深入探讨如何利用Java语言来实现各种数据结构和算法。这里我们将详细阐述几个关键的知识点。 首先,数据结构是存储和组织数据的方式,包括数组、链表、栈、队列、哈希表、树(如二叉树、...
5. **集合框架**:Java提供了丰富的集合框架,包括Set(不允许重复元素)、List(有序,允许重复元素)和Map(键值对)。HashSet、ArrayList、HashMap分别是它们的常见实现。 6. **树结构**:如二叉树、二叉搜索树...
通过将问题分解为子问题,然后存储子问题的解,避免重复计算,如背包问题、最长公共子序列、最短路径问题等。 4. **图论算法**:包括深度优先搜索(DFS)和广度优先搜索(BFS),以及Dijkstra算法、Floyd-Warshall...
在编程领域,掌握数据结构和算法是至关重要的,特别是对于使用Java这种广泛应用于企业级开发的语言。本资源“JAVA数据结构和算法”提供了一系列用Java语言编写的代码示例,旨在帮助初学者深入理解这些核心概念。虽然...
在编程世界中,Java数据结构和算法是程序员的基石,它们是解决问题和设计高效软件的核心。数据结构是指在计算机中组织和存储数据的方式,而算法则是解决特定问题的步骤或方法。了解并熟练掌握这两者对于提升编程技能...
《数据结构(Java版)(第4版)》是由叶核亚编著的一本经典教材,专注于讲解数据结构与算法的实现,特别是采用Java语言进行编程。这本书通过深入浅出的方式,帮助读者理解和掌握各种数据结构及其在实际问题中的应用...
在计算机科学领域中,MD5(Message-Digest Algorithm 5)是一种广泛使用的散列函数,能够将任意长度的数据转换为固定长度的128位(16字节)哈希值。由于其独特的特性,MD5被广泛应用于数据完整性检查、密码存储等多...
在编程领域,数据结构与算法是核心组成部分,尤其是在使用Java这样的高级编程语言时。数据结构是组织、管理和存储数据的方式,而算法则是解决问题或执行任务的精确步骤。本资料包聚焦于“JAVA版数据结构与算法”,将...
《Java数据结构和算法(第二版)》是深入学习编程基础和优化问题解决能力的重要教材。这本书涵盖了数据结构和算法的基础知识,以及如何在Java语言环境下实现这些概念。以下是其中的一些核心知识点: 1. **数据结构*...
本资源“Java数据结构和算法中文第二版”是一个面向Java程序员的教材,虽然版本较旧,但依然包含了许多经典的知识点。 1. **数组**:数组是最基础的数据结构,它存储同一类型的数据集合。在Java中,数组的长度是...
MD5(Message-Digest Algorithm 5)是一种广泛应用于数字签名、电子商务、信息加密等领域的散列算法。它能够将任意长度的消息压缩成一个固定长度的散列值(通常为128位),这个过程不可逆,且原始消息的微小改变会...
根据提供的信息,我们可以推断《Java数据结构和算法中文4(第二版)》是一本专注于Java编程语言中的数据结构与算法应用的专业书籍。虽然提供的部分内容并没有包含实际的章节或者具体的讲解内容,但根据书名、描述及...
C和Java都能有效地实现这些算法,它们各有优缺点,适用于不同的数据规模和场景。 2. **查找算法**:包括线性查找、二分查找、哈希查找等。二分查找在有序数组中效率较高,而哈希查找则利用散列函数快速定位,是解决...
12. **动态规划**:动态规划是一种优化技术,通过将大问题分解为子问题来解决,避免重复计算,常用于最优化问题。 13. **字符串处理**:Java的String类提供了许多处理字符串的方法,如拼接、查找、替换等。字符串...
这为开发者提供了快速实现SHA散列算法的方法,无需手动处理字节数据和编码问题。 在实际应用中,消息摘要算法SHA用于多种场景,比如数字签名、数据完整性校验、密码存储等。数字签名通常会结合公钥加密算法使用,...