如何求兩個數(shù)組的交集?

求兩個字符串的交集

昨天去閱文集團面試月培,遇到這么一道面試題:

寫一個方法intersection恩急,求兩個字符串的交集。
比如nameage兩個字符串的交集為a,e纪蜒。

這是個很簡單的查找算法,思路如下:

  1. 將字符串轉換成字符數(shù)組(array1霍掺、array2)匾荆;
  2. 依次查找array1中的元素在array2中是否存在;
  3. 如果存在杆烁,說明為共同元素(交集)牙丽,否則為非交集元素;

代碼實現(xiàn)如下:

/**
 * 輸出兩個字符串的交集(共同元素)
 */
public static void intersection(String text1, String text2) {
    char[] charArray1 = text1.toCharArray(); // 字符串1對應的數(shù)組
    char[] charArray2 = text2.toCharArray(); // 字符串2對應的數(shù)據(jù)
    for (int i = 0; i < charArray1.length; i++) {
        char charI = charArray1[i];
        for (int j = 0; j < charArray2.length; j++) {
            char charJ = charArray2[j];
            if (charI == charJ) {
                System.out.println(charI);
            }
        }
    }
}

執(zhí)行方法:

intersection("name", "age");

輸出結果:

a
e

符合預期兔魂。

換其它字符串測試烤芦,結果仍然正確。

到此為止析校,問題已得到解決构罗。

求多個字符串的交集

但這個問題還可以再進一步,如果是求n個字符串的共同元素呢智玻?

思路如下:

  1. 遍歷第一個字符串中的所有字符char_i遂唧;
  2. 寫一個方法,判斷char_i是否在指定的字符數(shù)組中吊奢;
  3. 依次判斷char_i是否在剩下的字符數(shù)組中盖彭,得到多個結果result_1、result_2...result_n页滚;
  4. result_1召边、result_2...result_n依次做&運算,得到最終結果result裹驰;
  5. 如果resulttrue隧熙,說明為交集元素,否則為非交集元素幻林。

代碼實現(xiàn)如下:

第1個方法:判斷字符c是否在字符數(shù)組array中

/**
 * 判斷字符c是否在字符數(shù)組charArray中
 * 如果在贞盯,返回true,否則返回false
 */
public static boolean isCharInArray(char c, char[] array) {
    for (int i = 0; i < array.length; i++) {
        char char_i = array[i];
        if (c == char_i) {
            return true;
        }
    }
    return false;
}

第2個方法:判斷字符c是否同時存在于多個字符數(shù)組arrays中

/**
 * 判斷字符c是否同時存在于多個字符數(shù)組中
 * 如果同時存在于多個數(shù)組中沪饺,返回true邻悬,否則返回false
 */
public static boolean isCharInArrays(char c, char[]... arrays) {
    boolean result = true;
    for (int i = 0; i < arrays.length; i++) {
        char[] array = arrays[i];
        boolean isCharInArray = isCharInArray(c, array);
        result = result & isCharInArray;
    }
    return result;
}

上面的方法也可以寫做以下形式:

/**
 * 判斷字符c是否同時存在于多個字符數(shù)組中
 * 如果同時存在于多個數(shù)組中,返回true随闽,否則返回false
 */
public static boolean isCharInArrays(char c, char[]... arrays) {
    boolean isCharInArrays = true;
    for (int i = 0; i < arrays.length; i++) {
        char[] array = arrays[i];
        boolean isCharInArray = false;
        for (int j = 0; j < array.length; j++) {
            if (c == array[j]) {
                isCharInArray = true;
                break;
            }
        }
        isCharInArrays = isCharInArrays & isCharInArray;
    }
    return isCharInArrays;
}

第3個方法:輸出所有數(shù)組的交集元素

/**
 * 輸出所有數(shù)組的交集元素
 */
public static void printCommonChar(char[]... arrays) {
    // 遍歷第一個數(shù)組
    for (int i = 0; i < arrays[0].length; i++) {
        char char_i = arrays[0][i];
        // 調用Arrays的靜態(tài)方法剔除第一個數(shù)組
        char[][] otherArrays = Arrays.copyOfRange(arrays, 1, arrays.length);
        // 判斷char_i是否存在于otherArrays中
        boolean result = isCharInArrays(char_i, otherArrays);
        if (result == true) {
            System.out.println(char_i);
        }
    }
}

將以上3個方法整合到一起父丰,得到如下結果:

/**
 * 輸出多個字符數(shù)組的交集元素
 */
public static void printCommonChar(char[]... arrays) {
    // 遍歷第一個數(shù)組的所有元素(字符)
    for (int i = 0; i < arrays[0].length; i++) {
        char char_i = arrays[0][i];
        boolean isCharInArrays = true;
        // 除去第一個數(shù)組,從j=1開始遍歷
        for (int j = 1; j < arrays.length; j++) {
            char[] array = arrays[j];
            boolean isCharInArray = false;
            for (int k = 0; k < array.length; k++) {
                if (char_i == array[k]) {
                    isCharInArray = true;
                    break;
                }
            }
            isCharInArrays = isCharInArrays & isCharInArray;
        }
        if (isCharInArrays) {
            System.out.println(char_i);
        }
    }
}

使用泛型對方法進行改造

至此,求多個字符數(shù)組的交集元素的功能已實現(xiàn)蛾扇,使用泛型對以上方法進行改造攘烛,即可得到一個通用的求數(shù)組交集的方法,如下:

  1. 使用泛型T代碼基本類型char
  2. 將元素比較方法由==替換為equals
  3. 本方法的僅限于求包裝類型數(shù)組的交集
/**
 * 輸出多個包裝類型數(shù)組的共有元素
 */
public static <T> void printCommonElements(T[]... arrays) {
    // 遍歷第一個數(shù)組的所有元素(字符)
    for (int i = 0; i < arrays[0].length; i++) {
        T object_i = arrays[0][i];
        boolean isCharInArrays = true;
        // 除去第一個數(shù)組镀首,從j=1開始遍歷
        for (int j = 1; j < arrays.length; j++) {
            T[] array = arrays[j];
            boolean isCharInArray = false;
            for (int k = 0; k < array.length; k++) {
                if (object_i.equals(array[k])) {
                    isCharInArray = true;
                    break;
                }
            }
            isCharInArrays = isCharInArrays & isCharInArray;
        }
        if (isCharInArrays) {
            System.out.println(object_i);
        }
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末坟漱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子更哄,更是在濱河造成了極大的恐慌芋齿,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件觅捆,死亡現(xiàn)場離奇詭異麻敌,居然都是意外死亡,警方通過查閱死者的電腦和手機术羔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門级历,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人玩讳,你說我怎么就攤上這事扛禽≈逄常” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵掐场,是天一觀的道長熊户。 經常有香客問我吭服,道長,這世上最難降的妖魔是什么蝌戒? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮桩匪,結果婚禮上友鼻,老公的妹妹穿的比我還像新娘。我一直安慰自己彩扔,他們只是感情好,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布过吻。 她就那樣靜靜地躺著纤虽,像睡著了一般绞惦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杰刽,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天贺嫂,我揣著相機與錄音雁乡,去河邊找鬼。 笑死曲饱,一個胖子當著我的面吹牛珠月,可吹牛的內容都是我干的。 我是一名探鬼主播驻谆,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼氛谜!你這毒婦竟也來了区端?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤杨何,失蹤者是張志新(化名)和其女友劉穎危虱,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體埃跷,經...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡弥雹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年剪勿,在試婚紗的時候發(fā)現(xiàn)自己被綠了方庭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡头朱,死狀恐怖项钮,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情寄纵,我是刑警寧澤脖苏,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布棍潘,位于F島的核電站,受9級特大地震影響恤浪,放射性物質發(fā)生泄漏。R本人自食惡果不足惜水由,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一赛蔫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鞠值,春花似錦渗钉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抵恋。三九已至宝磨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唤锉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工株憾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留晒衩,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓贝奇,卻偏偏與公主長得像靠胜,于是被迫代替她去往敵國和親毕源。 傳聞我的和親對象是個殘疾皇子陕习,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內容

  • 一该镣、數(shù)組定義 array() 1、索引數(shù)組 在一個變量中损合,存儲一個或多個值。數(shù)組中的每一個元素都有一個訪問ID拍埠,根...
    竹與豆閱讀 531評論 0 0
  • # 數(shù)組部分 # 1.## array_chunk($arr, $size [, $preserve_key = ...
    clothTiger閱讀 1,172評論 0 1
  • 數(shù)組在程序設計中枣购,為了處理方便擦耀, 把具有相同類型的若干變量按有序的形式組織起來。這些按序排列的同類數(shù)據(jù)元素的集合稱...
    朱森閱讀 3,933評論 2 13
  • 32店陳列 庫房 抽屜里模特
    高曉涵閱讀 144評論 0 0
  • 黃沙漫天分瘾,血雨染紅了大地德召,無助的呻吟和痛苦的撕咬聲汽纤,隨時隨地有一人倒下不再起來上岗,每時每刻都有生命走向死亡,像一...
    陳外邪閱讀 348評論 0 0