一道傳說中是百度面試的shell試題

2021-09-21 04:03:41 字數 2376 閱讀 3171

【問題】寫指令碼實現,可以用shell、perl等。把檔案b中有的,但是檔案a中沒有的所有行,儲存為檔案c,並統計c的行數。

翻譯**話就是,假設有乙個檔案a是:ab

cd檔案b是:ab

現在要求輸出「b有a沒有"的行,即1 2 3 4,然後wc-l一下。

【思路】兩個檔案比較,第一想法就是diff,但是diff 無論是-c還是-y會牽扯進大量的》 < + -不說,而且diff命令是直白對比,即使字母相同但所在行不同,也會被diff記錄。如果再用for in語句然後一項一項對比也不會很清晰的解決這個問題,所以要換個方法。

第二個方法就是comm命令,但是這個命令有乙個前提,就是要sort排序,comm比diff 高明之處在於它只比較內容而不在意是否同一行,但是要注意對比檔案的先後。#comm -12 a b是找"a和b都有"的項,#comm -23 a b就是找"a有而b沒有"。

【解答】perl我不會,我就用shell寫:

12

3

4

5

6

#!/bin/bash

#written by chrischan @ 2016-4-21

sorta.txt>a1.txt#排序,不然會有提示

sortb.txt>b1.txt

comm-23 b1.txt a1.txt >c.txt#由於是要找b有a沒有的,就要b寫在前,a寫在後

echo$(catc.txt|wc-l)

其實還有乙個更簡單的,只用一句話:

1

grep-v-x b.txt -f a.txt|wc-l

很多書上不寫grep -x -f的意思,這裡補一下:

-f:指定範本檔案,其內容含有乙個或多個範本樣式,讓grep查詢符合範本條件的檔案內容,格式為每列乙個範本樣式。

-x:只顯示全列符合的列。

從乙個題就能輕鬆看出shell的能力級別,用diff死糾纏就是初級,用comm就是中級,而grep就是高階。的確是乙個好題。

【補充】如果考python,求這種類似「你有我沒有」的東西,用set裡面的差集演算法。

1

2

3

4

5

6

7

8

9

10

>>>a=

>>>b=

>>>print(a-b)

set([1,2])#a有b沒有

>>>print(a ^ b)

set([1,2,5,6])#差集的補集

>>> a&b

#交集

>>> a|b

#全集

一道百度面試題

給出乙個整型陣列num,對其中的每個元素,輸出在它左側且比它小的最近元素,要求時間複雜度為o n 例如int num 2無左側最近元素 4左側最近的是2 1沒有 3左側最近的是1.分析 建立乙個棧,然後將陣列中的元素從右至左依次壓入棧中。對每個元素,入棧前先檢查棧頂元素是否比它大,若是的話,則該元素...

一道百度面試題

下面這段 是把中英文混合字串 漢字用兩個位元組表示,特點是第乙個位元組的最高位為1 中的大寫字母轉化為小寫字母,請找出其中的bug,注意各種異常情況。for char piterator szword piterator 0 piterator else if piterator a piterat...

百度一道面試題

我這裡複製的是原話,當然順序是不一定的,很多拿到題目第一反應就是用map,當然可以解決,但是效率不高。還有人覺得應該用演算法 我是沒想到用啥演算法好.還有覺得應該先排序.還有覺得用位圖.bitmap 等等方法!我都覺得麻煩,思維方式就是,從節省時間考慮,從陣列來看,我們都得遍歷一次陣列裡面的元素,那...