快速的判断两个字符串型数组是否有交集

■[面试题]如何快速的判断两个数组是否有交集

public boolean hasIntersection(String[] array1, String[] array2) {

...

}

array1中,只要有一个在array2中,存在,就返回true,否则返回false

求最快的方法

原帖:http://www.oschina.net/question/1756518_241715

■代码

--------------------------------------------------------------------------------

package javay.test;

import java.util.Arrays;

import java.util.HashMap;

import java.util.PriorityQueue;

import java.util.TreeMap;

public class TestIntersection {

public boolean hasIntersectionByHashMap(String[] array1, String[] array2) {

HashMap<String, String> map = new HashMap<String, String>();

for(String str : array2) {

map.put(str, str);

}

for (String str : array1) {

if (map.get(str) != null) {

return true;

}

}

return false;

}

public boolean hasIntersectionByTreeMap(String[] array1, String[] array2) {

TreeMap<String, String> map = new TreeMap<String, String>();

for(String str : array2) {

map.put(str, str);

}

for (String str : array1) {

if (map.get(str) != null) {

return true;

}

}

return false;

}

public boolean hasIntersectionByIndexOf(String[] array1, String[] array2) {

String map = Arrays.toString(array2);

for (String str : array1) {

if (map.indexOf(str) > -1) {

return true;

}

}

return false;

}

public boolean hasIntersectionBySortBS(String[] array1, String[] array2) {

Arrays.sort(array2);

for (String str : array1) {

if (Arrays.binarySearch(array2, str) > -1) {

return true;

}

}

return false;

}

public boolean hasIntersectionByPQueue(String[] array1, String[] array2) {

PriorityQueue<String> queue = new PriorityQueue<String>(array2.length);

for(String str : array2) {

queue.offer(str);

}

for (String str : array1) {

if (queue.contains(str)) {

return true;

}

}

return false;

}

public static void main(String[] args) {

int nMax = 4000000;

String[] b = new String[nMax];

for (int i = 0; i < nMax ; i ++) {

b[i] = String.valueOf(i);

}

String[] t = new String[1];

t[0] = String.valueOf(nMax - 1) + "x";

TestIntersection proc = new TestIntersection();

long a = System.currentTimeMillis();

System.out.println("HashMap:" + proc.hasIntersectionByHashMap(t, b) + "," + (System.currentTimeMillis() - a));

a = System.currentTimeMillis();

System.out.println("TreeMap:" + proc.hasIntersectionByTreeMap(t, b) + "," + (System.currentTimeMillis() - a));

a = System.currentTimeMillis();

System.out.println("IndexOf:" + proc.hasIntersectionByIndexOf(t, b) + "," + (System.currentTimeMillis() - a));

a = System.currentTimeMillis();

System.out.println("PQueue :" + proc.hasIntersectionByPQueue(t, b) + "," + (System.currentTimeMillis() - a));

a = System.currentTimeMillis();

System.out.println("SortBS :" + proc.hasIntersectionBySortBS(t, b) + "," + (System.currentTimeMillis() - a));

for (int i = (nMax - 1); i >= 0 ; i --) {

b[i] = String.valueOf(i);

}

System.out.println();

a = System.currentTimeMillis();

System.out.println("HashMap:" + proc.hasIntersectionByHashMap(t, b) + "," + (System.currentTimeMillis() - a));

a = System.currentTimeMillis();

System.out.println("TreeMap:" + proc.hasIntersectionByTreeMap(t, b) + "," + (System.currentTimeMillis() - a));

a = System.currentTimeMillis();

System.out.println("IndexOf:" + proc.hasIntersectionByIndexOf(t, b) + "," + (System.currentTimeMillis() - a));

a = System.currentTimeMillis();

System.out.println("PQueue :" + proc.hasIntersectionByPQueue(t, b) + "," + (System.currentTimeMillis() - a));

a = System.currentTimeMillis();

System.out.println("SortBS :" + proc.hasIntersectionBySortBS(t, b) + "," + (System.currentTimeMillis() - a));

}

}

--------------------------------------------------------------------------------

■测试结果

HashMap:false,4744

TreeMap:false,7159

IndexOf:false,875

PQueue :false,499

SortBS :false,469★

HashMap:false,6326

TreeMap:false,4666

IndexOf:false,495

PQueue :false,453

SortBS :false,421★

但也有例外的结果。

HashMap:false,4635

TreeMap:false,7257

IndexOf:false,859

PQueue :false,468★

SortBS :false,484

HashMap:false,6344

TreeMap:false,4712

IndexOf:false,588

PQueue :false,437

SortBS :false,417★

时间: 2024-08-08 05:51:03

快速的判断两个字符串型数组是否有交集的相关文章

判断两个字符串是否是变位词 (keep it up)

写一个函数判断两个字符串是否是变位词.变位词(anagrams)指的是组成两个单词的字符相同,但位置不同的单词.比如说, abbcd和abcdb就是一对变位词 这也是简单的题. 我们可以排序然后对比, 也可以直接统计字符出现的个数来判断.这里给出统计字符来判断的代码: bool isAnagram1(const string& vLeft, const string& vRight) { if (vLeft.size() != vRight.size()) return false; in

JavaSE8基础 String equalsIgnoreCase 判断两个字符串的内容是否相同 (不区分大小写)

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        code: package jizuiku.t02; public class Demo { public static void main(String[] args) { // 判断两个字符串的内容相同吗 不区分大小写 String s1 = "jizuiku"; String s2 = "a

java中判断两个字符串是否相等的问题

我最近刚学java,今天编程的时候就遇到一个棘手的问题,就是关于判断两个字符串是否相等的问题.在编程中,通常比较两个字符串是否相同的表达式是"==",但在java中不能这么写.在java中,用的是equals(); 例:A字符串和B和字符串比较: if(A.equals(B)){ } 返回true 或false. String 的equals 方法用于比较两个字符串是否相等.由于字符串是对象类型,所以不能用简单的"=="判断.而使用equals比较两个对象的内容是否

JavaSE8基础 String equals 判断两个字符串的内容是否相同(区分大小写)

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        code: package jizuiku.t02; public class Demo { public static void main(String[] args) { // 判断两个字符串的内容相同吗 String s1 = "jizuiku"; String s2 = "abcdef&q

[算法]判断两个字符串是否由相同的字符组成

如何判断两个字符串是否由相同的字符组成 题目描述: 由相同的字符组成是指组成两个字符串的字母以及各个字母的个数是一样的,只是排列顺序不同而已.例如"aaaabbc"与"abcbaaa"就由相同的字符组成的. 方法一: 排序法,将两个字符串中的字符排序,比较两个排序后的字符串是否相等.若相等则表明它们是由相同的字符组成的,否则,表明他们是由不同的字符组成的. import java.util.Arrays; public class Solution { public

【字符串】判断两个字符串是否由相同的字符组成

1 import java.util.Arrays; 2 import java.util.Scanner; 3 4 /** 5 * 功能:判断两个字符串是否由相同的字符组成,比如aaaabbc和abcbaaa就是. 6 * 思路1:将两个字符串按字符进行排序,判断排序后字符串是否相同: 7 * 思路2:申请一个256大小的int数组,遍历第一个字符串,遇到一个字符,就将字符对应的数组下标的元素+1,然后,遍历第二个字符串,同理-1,最后,判断数组的所有元素是否都是0. 8 */ 9 publi

字符串问题----判断两个字符串是否互为变形词

判断两个字符串是否互为变形词 给定两个字符串 str1 和str2 ,如果两个字符串中出现的字符种类一样,次数也一样,则互为变形词,实现一个函数判断两个字符串是否互为变形词.例如 str1="123",str2="132",true; str1="123",str2="1332",false; [解题思路] 1. 首先比较两个字符串的长度,长度不同肯定是false. 2. 如果长度相同,新建一个数组,用以存储每个字符出现次数.

(31-33)判断两个实型数据是否相等,求一元二次方程的根,逻辑型数据

(31)判断两个实型数据是否相等 1.abs求一个整型数据的绝对值,fabs,求一个浮点型数据的绝对值 (32)求一元二次方程的根 #include<stdio.h>#include<math.h>int main(void){ double a,b,c,d; printf("请依次输入二元一次方程的洗漱:\n"); scanf("%lf%lf%lf",&a,&b,&c); if (a==0) { printf(&qu

leetcode 161. One Edit Distance 判断两个字符串是否是一步变换 --------- java

Given two strings S and T, determine if they are both one edit distance apart. 给定两个字符串,判断他们是否是一步变换得到的. 在这里需要注意几点: 1.不等于1的变换都要返回false(包括变换次数等于0). 2.还有很多细节需要注意. 方法如下: 1.直接判断:1)如果差值大于1,直接返回false.  2)如果长度相同,那么依次判断,是否只有一个字母不一样.  3)如果不一样,那么看是否是只是多出了一个字母. p