每日算法练习题第二篇

感受算法之美,领悟编程真谛!

Posted by LJJ on July 24, 2018

每日算法练习题第二篇

前述:数据结构与算法是计算机应用的基础,也是每一个有趣和富有内涵的工程师基本功,本系列文章旨在记录本小白学习算法的过程以及通过算法和数据结构练习来感受Computer Scince的巨大魅力,吸引着我一直在这上面不断探索摸寻。

注:题目均为转载,大部分来自leetcode–>见 leetcode中文站

栏目分级

通过题目的难度依次从易到难分为三个阶段:

  1. easy
  2. middle
  3. hard

实际演练

step1:删除链表中的节点

请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
现有一个链表 --head =[4,5,1,9],它可以表示为:

示例 1:
输入: head = [4,5,1,9], node = 5
输出: [4,1,9]
解释: 给定你链表中值为5的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.

示例 2:
输入: head = [4,5,1,9], node = 1
输出: [4,5,9]
解释: 给定你链表中值为1的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.

说明:
链表至少包含两个节点。
链表中所有节点的值都是唯一的。
给定的节点为非末尾节点并且一定是链表中的一个有效节点。
不要从你的函数中返回任何结果。

解题思路:

  • 分析ListNode里的属性,val和next分别指向下一个next的值即可。

step2:删除最外层的括号

有效括号字符串为空("")、"(" + 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:
输入:"(()())(())(()(()))"
输出:"()()()()(())"
解释:
输入字符串为 "(()())(())(()(()))",原语化分解得到 "(()())" + "(())" + "(()(()))",
删除每隔部分中的最外层括号后得到 "()()" + "()" + "()(())" = "()()()()(())"。

解题思路:

  • 遍历字符串,遇到左括号入栈,遇到右括号出栈,栈空则找到一个原语,记录下找到原语的开始和结束位置,利用StringBuilder的append()将去掉最外层括号的字符追加到StringBuilder内。本题解题的关键是巧妙将原语的生成与栈紧密地结合了起来。

代码地址见:Github-Algorithm