题目要求:
输入链表的起始节点和整数n,需要去掉从链表结尾起第n个节点,然后返回新链表的起始节点。
思路:
用双指针方法确定位置,第一个指针先从头至尾移动n个节点,第二个指针开始移动,两个指针同步移动直至第一个指针到达链表尾部,第二个指针就到达了距离尾部距离n的节点,删除即可。
1 | # Definition for singly-linked list. |
输入链表的起始节点和整数n,需要去掉从链表结尾起第n个节点,然后返回新链表的起始节点。
用双指针方法确定位置,第一个指针先从头至尾移动n个节点,第二个指针开始移动,两个指针同步移动直至第一个指针到达链表尾部,第二个指针就到达了距离尾部距离n的节点,删除即可。
1 | # Definition for singly-linked list. |
输入整数数组和目标整数,求能使得和恰好为目标整数的所有四元组。
遍历两次全部二元组,第一次先创建一个所有二元组及其和的倒排索引,再第二次遍历,利用倒排索引查找相加之和等于当前二元组之和与目标之差的所有二元组,如果没有重复元素,则找到一个符合规则的四元组。
1 | class Solution(object): |
给定电话号码键盘上输入的一组数字字符串,求对应按键上所有可能的字母组合。
采用迭代方法,当数字长度为1时,返回所有字母,否则对从第二个数字开始的字符串继续应用函数,把返回的字符串分别附加到第一个数字对应的字母后,组成字符串,加到答案中并返回。
1 | class Solution(object): |
输入一个数组和一个目标整数,求一个数组中元素组成的三元组,使得三元组之和与目标整数最接近,返回该整数。
采用与015类似的方法,先对数组排序,i, j, k
为三元组所在位置, i
从左至右移动, j, k
在之后从两边向中间移动,同时记录和目标的差距,保留最优值。
1 | class Solution(object): |
输入数组和,求出数组中所有不重复的三元组,使得三元组只和为0。
先对全部数组排序,假设三元组的对应的位置是 i, j, k
,令 i
从左至右循环,j, k
从 i
右侧的两边向中间循环。遇到和为0的三个元素则记录下并将 j, k
继续向中间循环直至遇到不重复的元素,如和小于零则向右移动 j
,否则向左移动 k
。
1 | class Solution(object): |
从给定的一组字符串中,确定最长的公共前缀(LCP)。
先找出最短的字符串,然后从头开始测试每个字符,如果出现了最短字符串中的字符在其他字符串中相应位置没有出现的情况,该字符之前就是 LCP ,否则该最短字符串就是 LCP。
1 | class Solution(object): |
输入大于0小于3999的罗马数字,输出相对应的整数。
结果初始化为0,从左至右每一位罗马数依次转换为整数,加至待输出的整数。除第一位以外,当前一位小于当前位时,再从结果中减去两倍的前一位数。
1 | class Solution(object): |
输入大于0小于3999的整数,输出相对应的罗马数字。
罗马数字的拼写规则:
因为数字有上限3999,因此可以按1000、100、10、1为单位逐步转换,注意4和9的特殊情况即可
1 | class Solution(object): |
输入一个整数数组 height
,每个元素相当于一堵墙的高度,两堵墙之间距离为1,要求输出这些墙壁中能存住最多水的两堵墙
使用贪心法,从左右两端开始,计算最外侧两堵墙所能存住的水体积,并且每次放弃较矮的那堵墙,选择这一侧更靠近中心的下一堵墙继续尝试,直到两堵墙相遇。
1 | class Solution(object): |
输入整数x,确定该整数是否为回文数。注:负数不算回文数。
翻转该整数,比较翻转后整数与x是否相等。可以在翻转前排出一些简单情况。
1 | class Solution(object): |