国产精品一久久香蕉产线看-国产精品一区在线播放-国产精品自线在线播放-国产毛片久久国产-一级视频在线-一级视频在线观看免费

谷歌面試題

時間:2022-06-28 03:40:41 面試 我要投稿

谷歌面試題

實現一個算法來判斷一個字符串中的字符是否唯一(即沒有重復).不能使用額外的數據結構。 (即只使用基本的數據結構)

谷歌面試題

解答

首先,你可以問面試官,構成字符串的字符集有多大?是ASCII字符,還是只是26個字母? 還是有更大的字符集,對于不同的情況,我們可能會有不同的解決方案。

如果我們假設字符集是ASCII字符,那么我們可以開一個大小為256的bool數組來表征每個字 符的出現。數組初始化為false,遍歷一遍字符串中的字符,當bool數組對應位置的值為真, 表明該字符在之前已經出現過,即可得出該字符串中有重復字符。否則將該位置的bool數組 值置為true。代碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

bool isUnique1(string s)

{

    bool a[256];

    memset(a, 0, sizeof(a));

    int len = s.length();

    for(int i=0; i < len; ++i)

    {

        int v = (int)s[i];

        if(a[v]) return false;

        a[v] = true;

    }

    return true;

}

該算法的時間復雜度為O(n)。我們還可以通過位運算來減少空間的使用量。 用每一位表征相應位置字符的出現。對于ASCII字符,我們需要256位,即一個長度為8的int 數組a即可。這里的關鍵是要把字符對應的數字,映射到正確的位上去。比如字符’b’對應的 代碼是98,那么我們應該將數組中的哪一位置為1呢?用98除以32,得到對應數組a的下標: 3。98對32取模得到相應的位:2。相應代碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

bool isUnique2(string s)

{

    int a[8];

    memset(a, 0, sizeof(a));

    int len = s.length();

    for(int i=0; i < len; ++i)

    {

        int v = (int)s[i];

        int idx = v/32, shift=v%32;

        if(a[idx] & (1 << shift)) return false;

        a[idx] |= (1 << shift);

    }

    return true;

}

兩個算法的本質其實是一樣的,只不過一個用bool單元來表征字符出現,一個用位來表征。 完整代碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

#include <iostream>

#include <cstring>

using namespace std;


bool isUnique1(string s)

{

    bool a[256];

    memset(a, 0, sizeof(a));

    int len = s.length();

    for(int i=0; i < len; ++i)

    {

        int v = (int)s[i];

        if(a[v]) return false;

        a[v] = true;

    }

    return true;

}


bool isUnique2(string s)

{

    int a[8];

    memset(a, 0, sizeof(a));

    int len = s.length();

    for(int i=0; i < len; ++i)

    {

        int v = (int)s[i];

        int idx = v/32, shift=v%32;

        if(a[idx] & (1 << shift)) return false;

        a[idx] |= (1 << shift);

    }

    return true;

}

int main()

{

    string s1 = "i am hawstein.";

    string s2 = "abcdefghijklmnopqrstuvwxyzABCD1234567890";

    cout << isUnique1(s1) << " " << isUnique1(s2) << endl;

    cout << isUnique2(s1) << " " << isUnique2(s2) << endl;

    return 0;

}

如果字符集只是a-z(或是A-Z),那就更好辦了,用位運算只需要一個整型數即可。

1

2

3

4

5

6

7

8

9

10

11

12

bool isUnique3(string s)

{

    int check = 0;

    int len = s.length();

    for(int i=0; i < len; ++i)

    {

        int v = (int)(s[i]-'a');

        if(check & (1 << v)) return false;

        check |= (1 << v);

    }

    return true;

}

【JAVA實現】

1

2

3

4

5

6

7

8

9

  public static boolean isUniqueChars(String str) {

    int checker = 0;

    for (int i = 0; i < str.length(); ++i) {

      int val = str.charAt(i) - a;

      if ((checker & (1 << val)) > 0) return false;

      checker |= (1 << val);

    }

    return true;

  }

1

2

3

4

5

6

7

8

9

  public static boolean isUniqueChars2(String str) {

    boolean[] char_set = new boolean[256];

    for (int i = 0; i < str.length(); i++) {

      int val = str.charAt(i);

      if (char_set[val]) return false;

      char_set[val] = true;

    }

    return true;

  }


【谷歌面試題】相關文章:

谷歌中國面試題07-13

谷歌的面試題和招聘流程介紹07-13

谷歌有趣腦經急轉彎面試題,你會嗎?07-13

谷歌面試問題...07-13

谷歌公司待遇是怎樣的?07-11

谷歌的「親兒子」指什么?07-11

谷歌面試常見問題07-02

大家如何看待谷歌這款產品的?07-11

谷歌的穿越搜索帶來了什么?07-11

谷歌產品經理眼中的產品經理07-12

主站蜘蛛池模板: 色综合天天射 | 亚洲欧美一区二区三区在线 | 欧美白人黑人xxxx猛交 | 99精品免费在线观看 | 综合 欧美 国产 视频二区 | 91短视频在线观看手机 | 黄色小视频在线看 | 500福利国产精品导航在线 | 亚洲国产欧美在线人网站 | 日韩欧美亚洲综合一区二区 | 麻豆久久婷婷国产综合五月 | 中文字幕欧美日韩 | 欧美成人亚洲综合精品欧美激情 | 一级做a爱片就在线看 | 日韩手机在线免费视频 | 免费观看性欧美特黄 | 色综合久久88色综合天天提莫 | 成人免费观看一区二区 | 免看一级a一片成人123 | 日本天天操| 2020国产精品视频 | 成人亚洲性情网站www在线观看 | 视频一区二区国产 | 久99国产在线视频 | 成人十八影院在线观看 | 欧美整片完整片视频在线 | 欧美在线视频第一页 | 成人高清视频在线观看 | 一级黄色免费观看 | 精品偷国情拍在线视频 | 日韩伦理片在线观看光棍影院 | 免费成人黄色 | 狂野欧美性猛交xxxx免费按摩 | 成人免费观看www视频 | 在线精品国产成人综合第一页 | 日本高清h色视频在线观看 日本妇人成熟免费观看18 | 日本一区二区三区四区视频 | 青草草在线 | 日韩视频一区二区 | 一区二区三区免费精品视频 | 韩日毛片 |