美文网首页
关于“经常调用怎么办”这类的follow up

关于“经常调用怎么办”这类的follow up

作者: MrWheat | 来源:发表于2018-09-19 09:26 被阅读0次

    Reverse bits of a given 32 bits unsigned integer.
    Example:
    Input: 43261596
    Output: 964176192
    Explanation: 43261596 represented in binary as 00000010100101000001111010011100,
    return 964176192 represented in binary as 00111001011110000010100101000000.
    Follow up:
    If this function is called many times, how would you optimize it?

    // cache
    private final Map<Byte, Integer> cache = new HashMap<Byte, Integer>();
    public int reverseBits(int n) {
        byte[] bytes = new byte[4];
        for (int i = 0; i < 4; i++) // convert int into 4 bytes
            bytes[i] = (byte)((n >>> 8*i) & 0xFF);
        int result = 0;
        for (int i = 0; i < 4; i++) {
            result += reverseByte(bytes[i]); // reverse per byte
            if (i < 3)
                result <<= 8;
        }
        return result;
    }
    
    private int reverseByte(byte b) {
        Integer value = cache.get(b); // first look up from cache
        if (value != null)
            return value;
        value = 0;
        // reverse by bit
        for (int i = 0; i < 8; i++) {
            value += ((b >>> i) & 1);
            if (i < 7)
                value <<= 1;
        }
        cache.put(b, value);
        return value;
    }
    

    Given a string s and a string t, check if s is subsequence of t.
    You may assume that there is only lower case English letters in both s and t. t is potentially a very long (length ~= 500,000) string, and s is a short string (<=100).
    A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, "ace" is a subsequence of "abcde" while "aec" is not).
    Example 1:
    s = "abc", t = "ahbgdc"
    Return true.
    Example 2:
    s = "axc", t = "ahbgdc"
    Return false.
    Follow up:
    If there are lots of incoming S, say S1, S2, ... , Sk where k >= 1B, and you want to check one by one to see if T has its subsequence. In this scenario, how would you change your code?

    public boolean isSubsequence(String s, String t) {
            List<Integer>[] idx = new List[256]; // Just for clarity
            for (int i = 0; i < t.length(); i++) {
                if (idx[t.charAt(i)] == null)
                    idx[t.charAt(i)] = new ArrayList<>();
                idx[t.charAt(i)].add(i);
            }
            
            int prev = 0;
            for (int i = 0; i < s.length(); i++) {
                if (idx[s.charAt(i)] == null) return false; // Note: char of S does NOT exist in T causing NPE
                int j = Collections.binarySearch(idx[s.charAt(i)], prev);
                if (j < 0) j = -j - 1;
                if (j == idx[s.charAt(i)].size()) return false;
                prev = idx[s.charAt(i)].get(j) + 1;
            }
            return true;
        }
    

    注意:对于这类问题,首先可以想到cache,有些东西算一遍之后可以重复使用。

    相关文章

      网友评论

          本文标题:关于“经常调用怎么办”这类的follow up

          本文链接:https://www.haomeiwen.com/subject/ziybnftx.html