Daily LeetCode – day0069 0927. Three Equal Parts

// 0927. Three Equal Parts
class Solution {
    public int[] threeEqualParts(int[] arr) {
        int sum = 0;
        for (int d : arr) sum += d;
        if (sum == 0) return new int[]{0, 2};
        int[] ans = new int[]{-1, -1};
        if (sum % 3 != 0) return ans;
        int oneThird = sum / 3;
        int first1Part3 = arr.length;
        int count1 = 0;
        while (count1 != oneThird) {
            --first1Part3;
            count1 += arr[first1Part3];
        }
        int lengthPart = arr.length - first1Part3;
        int first1Part1 = 0;
        while (arr[first1Part1] == 0) ++first1Part1;
        for (int i = 0; i < lengthPart; ++i) {
            if (arr[first1Part1 + i] != arr[first1Part3 + i]) return new int[]{-1, -1};
        }
        ans[0] = first1Part1 + lengthPart - 1;
        int first1Part2 = first1Part1 + lengthPart;
        while (arr[first1Part2] == 0) ++first1Part2;
        for (int i = 0; i < lengthPart; ++i) {
            if (arr[first1Part2 + i] != arr[first1Part3 + i]) return new int[]{-1, -1};
        }
        ans[1] = first1Part2 + lengthPart;
        return ans;
    }
}
学习笔记:
这是一道困难题,需要把数字变成三等分。
首先我们找到最后一段,因为最后一段可以保证后面的确定性,至于前导零就不考虑了。
然后根据最后一段的情况,来找第一段,先去掉前导零,然后试试看对不对得上。
如果第一段没问题,就再去掉前导零试试看找第二段。
全部都没问题就可以把两个下标找到返回了。
发表在 每日LeetCode | 留下评论

Daily LeetCode – day0068 0811. Subdomain Visit Count

// 0811. Subdomain Visit Count
class Solution {
    public List<String> subdomainVisits(String[] cpdomains) {
        HashMap<String, Integer> hashMap = new HashMap<>();
        for (String cpdomain : cpdomains) {
            String[] splitted = cpdomain.split(" ");
            int times = Integer.parseInt(splitted[0]);
            String domain = splitted[1];
            if (hashMap.containsKey(domain)) {
                hashMap.put(domain, hashMap.get(domain) + times);
            } else {
                hashMap.put(domain, times);
            }
            int len = domain.length();
            for (int i = 0; i < len; ++i) {
                if ('.' == domain.charAt(i)) {
                    String subdomain = domain.substring(i + 1, len);
                    if (hashMap.containsKey(subdomain)) {
                        hashMap.put(subdomain, hashMap.get(subdomain) + times);
                    } else {
                        hashMap.put(subdomain, times);
                    }
                }
            }
        }
        List<String> ans = new LinkedList<>();
        for (Map.Entry<String, Integer> entry : hashMap.entrySet()) {
            StringBuilder sb = new StringBuilder();
            sb.append(entry.getValue()).append(' ').append(entry.getKey());
            ans.add(sb.toString());
        }
        return ans;
    }
}
学习笔记:
这道题是哈希表统计数量的题目,不难,但巧妙的地方在于如何进行字符串的切割。
发表在 每日LeetCode | 留下评论

Daily LeetCode – day0067 0921. Minimum Add to Make Parentheses Valid

// 0921. Minimum Add to Make Parentheses Valid
class Solution {
    public int minAddToMakeValid(String s) {
        char[] parentheses = s.toCharArray();
        int stack = 0;
        int ans = 0;
        for (char c : parentheses) {
            if (c == '(') {
                ++stack;
            } else if (stack != 0) {
                --stack;
            } else {
                ++ans;
            }
        }
        return ans + stack;
    }
}
学习笔记:
今天的每日一题是一道栈的题目,但是其实我们也不需要用到真正的栈。
拿一个整数来模拟栈里左括号的数量也就行了。
发表在 每日LeetCode | 留下评论

Daily LeetCode – day0066 1784. Check if Binary String Has at Most One Segment of Ones

// 1784. Check if Binary String Has at Most One Segment of Ones
class Solution {
    public boolean checkOnesSegment(String s) {
        return !s.contains("01");
    }
}
学习笔记:
由于开头没有前导零,那么开头必须是1,或者只有0。
要有第二段1111的,必须有中间夹的0和后面跟着的1,也就是说要包含01。
所以这道题就是检查是否包含01子串就行。
发表在 每日LeetCode | 留下评论

Daily LeetCode – day0065 0777. Swap Adjacent in LR String

// 0777. Swap Adjacent in LR String
class Solution {
    public boolean canTransform(String start, String end) {
        char[] s = start.toCharArray();
        char[] e = end.toCharArray();
        int len = s.length;
        int xs = 0;
        for (int i = 0; i < len; ++i) {
            if (s[i] == 'X') ++xs;
            if (e[i] == 'X') --xs;
        }
        if (xs != 0) return false;
        for (int i = 0, j = 0; i < len; ++i) {
            if (s[i] == 'L') {
                while (j < len && e[j] != 'L') ++j;
                if (j > i) return false;
                ++j;
            }
            if (s[i] == 'R') {
                while (j < len && e[j] != 'R') ++j;
                if (j < i) return false;
                ++j;
            }
        }
        return true;
    }
}
学习笔记:
这道题特别难,L可以往左边走,R可以往右边走,但互相不可以跨越。
那就是说X的总数一样,L总数一样,R总数一样。
然后从左到右的L和R顺序都一样,并且这样还不够!我就被坑在这里面了。
因为LX是变不到XL的,L没办法往右。
所以要用双指针跑,如果L的话,i要小于等于j,如果是R的话,i要大于等于j。
发表在 每日LeetCode | 留下评论

Daily LeetCode – day0064 1694. Reformat Phone Number

// 1694. Reformat Phone Number
class Solution {
    public String reformatNumber(String number) {
        StringBuilder sb = new StringBuilder();
        StringBuilder ans = new StringBuilder();
        for (int i = 0; i < number.length(); ++i) {
            if (number.charAt(i) >= '0' && number.charAt(i) <= '9') {
                sb.append(number.charAt(i));
            }
        }
        int i = 0;
        while (i < sb.length() - 4) {
            ans.append(sb.charAt(i));
            ++i;
            ans.append(sb.charAt(i));
            ++i;
            ans.append(sb.charAt(i));
            ++i;
            ans.append('-');
        }
        if (i == sb.length() - 4) {
            ans.append(sb.charAt(i));
            ++i;
            ans.append(sb.charAt(i));
            ++i;
            ans.append('-').append(sb.charAt(i));
            ++i;
            ans.append(sb.charAt(i));
        } else {
            while (i < sb.length()) {
                ans.append(sb.charAt(i));
                ++i;
            }
        }
        return ans.toString();
    }
}
学习笔记:
这道题就是将数字提取出来,然后3个一组。
剩下不到4个或刚好4个再进行处理。
发表在 每日LeetCode | 留下评论

Daily LeetCode – day0063 面试题 01.08. Zero Matrix LCCI

// 面试题 01.08. Zero Matrix LCCI
class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        boolean column0Has0 = false;
        for (int i = 0; i < m; ++i) {
            if (matrix[i][0] == 0) {
                column0Has0 = true;
            }
            for (int j = 1; j < n; ++j) {
                if (matrix[i][j] == 0) {
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }
        for (int i = m - 1; i >= 0; --i) {
            for (int j = 1; j < n; ++j) {
                if (matrix[i][0] == 0 || matrix[0][j] == 0) {
                    matrix[i][j] = 0;
                }
            }
        }
        if (column0Has0) {
            for (int i = 0; i < m; ++i) {
                matrix[i][0] = 0;
            }
        }
    }
}
学习笔记:
今天虽然是一道比较简单的题目,动态清零
先统计行列是否有0,再操作,但是要做到只使用一个变量属实不容易,所以这也是一道很好的面试题目。
发表在 每日LeetCode | 留下评论

Daily LeetCode – day0062 面试题 01.09. String Rotation LCCI

// 面试题 01.09. String Rotation LCCI
class Solution {
    public boolean isFlipedString(String s1, String s2) {
        return s1.length() == s2.length() && (s1 + s1).contains(s2);
    }
}
学习笔记:
这是一道简单题,但是特别巧妙,拼接了两份后再寻找,这样寻找起来就很快了。
发表在 每日LeetCode | 留下评论

Daily LeetCode – day0061 面试题 17.09. Get Kth Magic Number LCCI

// 面试题 17.09. Get Kth Magic Number LCCI
class Solution {
    public int getKthMagicNumber(int k) {
        int[] magicNumbers = new int[k + 1];
        magicNumbers[1] = 1;
        int pointer3 = 1;
        int pointer5 = 1;
        int pointer7 = 1;
        for (int i = 2; i <= k; ++i) {
            int min = Math.min(Math.min(magicNumbers[pointer3] * 3, magicNumbers[pointer5] * 5), magicNumbers[pointer7] * 7);
            if (min == magicNumbers[pointer3] * 3) ++pointer3;
            if (min == magicNumbers[pointer5] * 5) ++pointer5;
            if (min == magicNumbers[pointer7] * 7) ++pointer7;
            magicNumbers[i] = min;
        }
        return magicNumbers[k];
    }
}
学习笔记:
这是一道简单的题目,之前有教过学生。
就是比较三个数里面最小的,添加到数组里面。
找到第k个数字。
发表在 每日LeetCode | 留下评论

Daily LeetCode – day0060 面试题 01.02. Check Permutation LCCI

// 面试题 01.02. Check Permutation LCCI
class Solution {
    public boolean CheckPermutation(String s1, String s2) {
        if (s1.length() != s2.length()) return false;
        int len = s1.length();
        int[] count = new int[123];
        for (int i = 0; i < len; ++i) {
            ++count[s1.charAt(i)];
            --count[s2.charAt(i)];
        }
        for (int i = 97; i < 123; ++i) {
            if (count[i] != 0) return false;
        }
        return true;
    }
}
学习笔记:
连续困难题之后,今天终于轮到了一道简单题。
这是一道计数的问题,很简单就完成了。0ms击败100%。
发表在 每日LeetCode | 留下评论