ARTS Week 06

Algorithm

1021. 删除最外层的括号

有效括号字符串为空 ("")、"(" + A + ")" 或 A + B,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。例如,"","()","(())()" 和 "(()(()))" 都是有效的括号字符串。
如果有效字符串 S 非空,且不存在将其拆分为 S = A+B 的方法,我们称其为原语(primitive),其中 A 和 B 都是非空有效括号字符串。
给出一个非空有效字符串 S,考虑将其进行原语化分解,使得:S = P_1 + P_2 + ... + P_k,其中 P_i 是有效括号字符串原语。
对 S 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 S 。

示例 1:
输入:"(()())(())"
输出:"()()()"
解释:
输入字符串为 "(()())(())",原语化分解得到 "(()())" + "(())",
删除每个部分中的最外层括号后得到 "()()" + "()" = "()()()"。
示例 2:
输入:"(()())(())(()(()))"
输出:"()()()()(())"
解释:
输入字符串为 "(()())(())(()(()))",原语化分解得到 "(()())" + "(())" + "(()(()))",
删除每隔部分中的最外层括号后得到 "()()" + "()" + "()(())" = "()()()()(())"。
示例 3:
输入:"()()"
输出:""
解释:
输入字符串为 "()()",原语化分解得到 "()" + "()",
删除每个部分中的最外层括号后得到 "" + "" = ""。

提示:
S.length <= 10000
S[i] 为 "(" 或 ")"
S 是一个有效括号字符串

思路

解决这题时刚开始的思路是这样的:
首先要将字符串进行原语化分解,得到多个原语字符串,然后再去除每个原语字符串中最外层的括号,将这些字符串拼接起来。

其中关键点就在于怎么将字符串进行分解,参考如下步骤:
首先设置一个计数器c和一个临时字符数组,遍历字符串,当碰到左括号时加一,碰到右括号时减一,将当前字符串加到临时字符数组中,当计数器c的值为0时,就可以确定当前已经位于一个原语字符串的末尾,也就可以将临时字符数组中的内容拷贝到结果字符串中,拷贝时略过数组中第一个和最后一个字符。

这个思路可以解决问题,但是每次找到原语字符串后还要再进行一次拷贝动作,从而增加了复杂度,因此接下去要考虑怎么把后面的拷贝动作去除。
其想法就是在遍历字符串S时直接将不是最外层括号的字符添加到结果字符数组中。
因此这里的关键问题转换成了怎么检测出当前的括号是不是最外层括号,其实思路和前面分解字符串的思路一致,就是在遍历字符串的时候碰到左括号计数器c值加一,碰到右括号计数器c值减一。不过在修改计数器c的值之前,需要先进行判断,即,当前字符为左括号且计数器c的值为0时,当前左括号为最外层括号。当前字符为右括号且计数器c的值为1时,当前右括号是最外层括号。

代码

class Solution {
    public String removeOuterParentheses(String S) {
        char[] result = new char[S.length()];

        int count = 0;
        int index = 0;
        for (int i = 0; i < S.length(); i++) {
            char c = S.charAt(i);

            if ((c == '(' && count++ > 0) ||
                    (c == ')' && count-- > 1)) {
                result[index++] = c;
            }
        }

        return new String(result, 0, index);
    }
}

Review

Stop, Think, Code — Iterate
这篇文章说开发者不应该一开始就陷入代码实现的细节中,而应该在多做思考,然后再动手实现,并且同时辅之以单元测试之类的手段保证功能的正确性。作者的观点还是很明确的,但是感觉缺少一些具体的步骤说明,并且也没有具体的例子,令人感觉有点空洞,不能给人以很好的指引作用。

Tip

这周发现了一款免费的文件比对工具DiffMerge
,虽然功能和界面相对BCompare都略微逊色,但是作为一个文件比对工具还是值得一用的。
安装后可以像BCompare一眼更直接在右键菜单中使用:

image.png

比对界面如下:
ARTS Week 06_第1张图片
image.png

Share

这周因为面试、准备入职和到新公司报道的原因,感觉也没有什么好分享的,还是说一说最近找工作自己的一些体会吧。
先说说大公司吧,因为面试过腾讯、百度之类的公司,我的感觉就是:首先,对于基础知识的掌握要非常牢固,比如java、数据结构和算法之类的,并且偏向于问原理。一个点会先从表面问起,然后慢慢深入,到原理、为什么这样做之类的。其次就是问的问题如果你直说不会的话,面试官会立马转向另一个问题的。再呢,我觉得比较好的就是,面对注入算法之类的题目,面试官会慢慢引导你回答,还有一些问题不知道的时候面试官也会告诉你答案。感觉去这些公司面试的过程本身也是很舒服的,能够学到不少东西。
然后就是一些小公司,问的问题就相对不会那么深入了,但是感觉很看重项目经历,会抓住你简历的项目经历一一盘问,所以在简历上的项目经历一定都要好好的准备一番,涉及的一些知识点、碰到的一些问题之类的。
再就是不管什么公司,都会问的一些问题,比如说自我介绍啊、离职原因之类的,针对这些问题,感觉还是需要了解面试官期望什么样的回答吧,在面试前不妨转换到面试官的角度想想,然后再做准备,这样的话结果大概会更好吧。
总的来说呢,如果想要进bat之类的公司,平时一定要积累基础知识,不然的话希望是不很大的。然后呢,自己的简历肯定要好好的修改,把自己最熟悉,最擅长的一些写在简历上,自己不熟悉的不要在简历上展示。再就是对于一些一定会问的问题一定要准备好,自我介绍、项目介绍、离职原因之类的。介绍的时候也一定要说自己熟悉的,不要把自己接触过的东西一股脑全说出来,这样给自己挖的坑就太深了。

你可能感兴趣的:(ARTS Week 06)