自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

guoziqing506的博客

记录学习点滴,享受算法乐趣

  • 博客(45)
  • 收藏
  • 关注

原创 二进制中有多少个1

题目描述:计算在一个 32 位的整数的二进制表式中有多少个 1.样例:给定 32 (100000),返回 1;给定 5 (101),返回 2;给定 1023 (111111111),返回 9很简单的题目,当然可以先对十进制的整数转换成二进制,再统计1的个数。但是通过位运算(其实就是通过分析二进制位上0,1的关系,直接对0,1比特位进行运算)我们可以更快地解决问题。先说一下基本的几种

2016-05-31 22:24:57 3701

原创 最长无重复字符的子串

题目描述:给定一个字符串,请找出其中无重复字符的最长子字符串。样例:例如,在"abcabcbb"中,其无重复字符的最长子字符串是"abc",其长度为 3。对于,"bbbbb",其无重复字符的最长子字符串为"b",长度为1。从头开始扫描字符串,通过一个哈希表来记录每个字符以及字符所在的位置,若新扫描的字符不在哈希表中,则继续向前;若在哈希表中(记为cur),则证明此时已经不是无重复字符的子串

2016-05-31 09:51:19 1075

原创 有效回文串

题目描述:给定一个字符串,判断其是否为一个回文串。只包含字母和数字,忽略大小写。样例:"A man, a plan, a canal: Panama" 是一个回文。"race a car" 不是一个回文。之前判断过一个链表十分是回文链表(详见:点击打开链接),字符串的判断比链表简单,因为可以从后往前回溯。但是在这道题当中,空格,标点,以及其他非字母或数字的字符是不能算在

2016-05-29 09:29:01 744

原创 两个字符串是变位词

题目描述:写出一个函数 anagram(s, t) 判断两个字符串是否可以通过改变字母的顺序变成一样的字符串。样例:给出 s = "abcd",t="dcab",返回 true.给出 s = "ab", t = "ab", 返回 true.给出 s = "ab", t = "ac", 返回 false.根据题意,所谓“变位词”就是说两点:1. 两个字符串各自所拥有的

2016-05-28 23:40:25 2138

原创 空格替换

题目描述:设计一种方法,将一个字符串中的所有空格替换成 %20 。你可以假设该字符串有足够的空间来加入新的字符,且你得到的是“真实的”字符长度。你的程序还需要返回被替换后的字符串的长度。样例:对于字符串"Mr John Smith", 长度为 13,替换空格之后,参数中的字符串需要变为"Mr%20John%20Smith",并且把新长度 17 作为结果返回。可以这样来考虑,因为数组足够长,

2016-05-28 23:26:41 743 1

原创 旋转字符串

题目描述:给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转)样例:对于字符串 "abcdefg".offset=0 => "abcdefg"offset=1 => "gabcdef"offset=2 => "fgabcde"offset=3 => "efgabcd"这种旋转的问题,基本步骤是三步:1. 找到偏移量对字符串的余数,这是实际需要

2016-05-28 21:06:45 1066 1

原创 翻转字符串

题目描述:给定一个字符串,逐个翻转字符串中的每个单词。说明:单词的构成:无空格字母构成一个单词输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个样例:给出s = "the sky is blue",返回"blue is sky the"建立一个空字符串,然后扫描给出的字符串,依次从前往后

2016-05-27 11:19:43 557

原创 最长单词

题目描述:给一个词典,找出其中所有最长的单词。样例:在词典{  "dog",  "google",  "facebook",  "internationalization",  "blabla"}中, 最长的单词集合为 ["internationalization"]在词典{  "like",  "love",  "hate",  "

2016-05-26 19:23:23 1140 1

原创 最后一个单词的长度

题目描述:给定一个字符串, 包含大小写字母、空格' ',请返回其最后一个单词的长度。如果不存在最后一个单词,请返回 0 。样例:给定 s = "Hello World",返回 5。可以这样设计:从字符串最后开始往前找,找到第一个是字母的位置,从这个位置开始,继续向前遍历,每遍历一个字母,计数+1,直到遍历到第一个不是字母的位置为止(其实这个程序也可以解决除了字母和空格外有其他字符的情况)

2016-05-26 19:13:44 499

原创 报数

题目描述:报数指的是,按照其中的整数的顺序进行报数,然后得到下一个数。如下所示:1, 11, 21, 1211, 111221, ...1 读作 "one 1" -> 11.11 读作 "two 1s" -> 21.21 读作 "one 2, then one 1" -> 1211.给定一个整数 n, 返回 第 n 个顺序。样例:给定 n = 5, 返回 "111221".

2016-05-26 17:38:44 1950

原创 比较字符串

题目描述:比较两个字符串A和B,确定A中是否包含B中所有的字符。字符串A和B中的字符都是 大写字母样例:给出 A = "ABCD", B = "ACD",返回 true;给出 A = "ABCD", B = "AABC", 返回 false这里面需要注意的是A,B中可能有重复的字符。因此,既然是判断A是否全部包含B,可以这样做:1. 扫描A,然后用一个hash表记录A中出现的每一个

2016-05-26 12:50:49 1066

原创 最长公共前缀

题目描述:给k个字符串,求出他们的最长公共前缀(LCP)样例:在 "ABCD" "ABEF" 和 "ACEF" 中,  LCP 为 "A";在 "ABCDEFG", "ABCEFG", "ABCEFA" 中, LCP 为 "ABC"其实最简单的方法,两两比较就行。我用的是这种思路:先找出字符串数组中最长的字符串(为方便描述,记为max_str),然后用max_str从数组的头开始依次比

2016-05-25 16:40:49 4134

原创 判断字符串是否没有重复字符

题目描述:实现一个算法确定字符串中的字符是否均唯一出现样例:给出"abc",返回 true;给出"aab",返回 false挑战 :如果不使用额外的存储空间,你的算法该如何改变?很简单的题目。最简单的方法是遍历数组,然后使用一个数据结构(列表,集合都可以)保存遍历到的元素,将新遍历到的元素与这个结构里面存储的元素相比较,若发现重复了,则返回False,若一直没有重复的,返回True。

2016-05-23 22:17:22 4344

原创 主元素 II

题目描述:给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一。样例:给出数组[1,2,1,2,1,3,3] 返回 1之前,有果一道“主元素”的问题(详见:点击打开链接),我们用的是“消去法”,因为主元素的个数大于元素总数的二分之一,可以保存只有一个元素的hash表,通过消去法解决。现在条件变了,变成大于三分之一了。其实,这个题目还有一个变形,那就是严格大于1/k的主元素搜寻。其实道理是一样的。我们的基本做法如下:

2016-05-23 19:00:58 1729

原创 跳跃游戏 II

题目描述:给出一个非负整数数组,你最初定位在数组的第一个位置。数组中的每个元素代表你在那个位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。样例:给出数组A = [2,3,1,1,4],最少到达数组最后一个位置的跳跃次数是2(从数组下标0跳一步到数组下标1,然后跳3步到数组的最后一个位置,一共跳跃2次)跟上一道题:“跳跃游戏”(详见:点击打开链接)基本逻辑是一样的

2016-05-23 17:15:17 2651

原创 跳跃游戏

题目描述:给出一个非负整数数组,你最初定位在数组的第一个位置。数组中的每个元素代表你在那个位置可以跳跃的最大长度。判断你是否能到达数组的最后一个位置。样例:A = [2,3,1,1,4],返回 true.A = [3,2,1,0,4],返回 false.加入第0位的值是i,那也就是说最远能从第0位跳到第 i 位,其实,这也就意味着0到 i 的所有位置都能到达。因此,算法可以这样

2016-05-20 09:51:47 1295

原创 lintcode - 加油站

题目描述:在一条环路上有 N 个加油站,其中第 i 个加油站有汽油gas[i],并且从第_i_个加油站前往第_i_+1个加油站需要消耗汽油cost[i]。你有一辆油箱容量无限大的汽车,现在要从某一个加油站出发绕环路一周,一开始油箱为空。求可环绕环路一周时出发的加油站的编号,若不存在环绕一周的方案,则返回-1。样例:现在有4个加油站,汽油量gas[i]=[1, 1, 3, 1],环路旅行时消耗的

2016-05-20 09:34:20 546

原创 寻找缺失的数

题目描述:给出一个包含 0 .. N 中 N 个数的序列,找出0 .. N 中没有出现在序列中的那个数。样例:N = 4 且序列为 [0, 1, 3] 时,缺失的数为2。之前,有一道找寻第一个丢失的正整数(详见:点击打开链接)的问题。当时用的是桶排序(详见:点击打开链接)这题题呢,其实和上一道题没有本质不同了,完全可以用相同的方法解决。但是更简单,为什么呢?因为所有数组中可能出现的元素

2016-05-17 15:03:42 1449

原创 买卖股票的最佳时机 II

题目描述:假设有一个数组,它的第i个元素是一个给定的股票在第i天的价格。设计一个算法来找到最大的利润。你可以完成尽可能多的交易(多次买卖股票)。然而,你不能同时参与多个交易(你必须在再次购买前出售股票)。样例:给出一个数组样例[2,1,2,0,1], 返回 2这道题比上一道题“买卖股票的最佳时机”(详见:点击打开链接)还要简单。因为有不定次数的交易,所以,最“贪心”的办法就是只要明天的

2016-05-17 14:15:40 2191

原创 买卖股票的最佳时机

题目描述:假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格。如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润。样例:给出一个数组样例 [3,2,3,1,2], 返回 1 换一个角度来思考这个问题,最大利润实际上就是每天的交易价格,减去上一天的价格所构成的这个数组的最大子数组。有关最大子数组的解法已经讲过(详见:点击打开链接),不明白的请回看。

2016-05-17 11:34:55 3053

原创 主元素

题目描述:给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一。样例:给出数组[1,1,1,1,2,2,2],返回 1两种方法可以用来解决这个问题:1. 中位数,因为主元素出现次数严格大于数组元素个数的二分之一,所以肯定是数组的中位数。而求取中位数的算法曾经讲过(详见:点击打开链接)2. 贪心法:因为元素个数大于数组的二分之一,所以,我们可以采用消除的方

2016-05-17 11:00:48 3479

原创 删除排序数组中的重复数字 II

题目描述:跟进“删除重复数字”:如果可以允许出现两次重复将如何处理?样例:给出数组A =[1,1,1,2,2,3],你的函数应该返回长度5,此时A=[1,1,2,2,3]。题目是上一道题“删除排序数组中的重复数字”(详见:点击打开链接)的延伸,现在要求可以保留出现两次的重复。那也很简单,用一个整型变量count来统计出现的次数,大于2了,就删。基本思路和上一道题一模一样。直接给代码

2016-05-13 17:12:53 696

原创 删除排序数组中的重复数字

题目描述:给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度。不要使用额外的数组空间,必须在原地没有额外空间的条件下完成。样例:给出数组A =[1,1,2],你的函数应该返回长度2,此时A=[1,2]。主要是看清题目,题目要求是三点:1. 返回去重后数组的长度2. 原数组要变,变成没有重复元素的,但是不用返回3. 没有额外空间(也就是

2016-05-13 15:38:36 2247

原创 恢复旋转排序数组

题目描述:给定一个旋转排序数组,在原地恢复其排序。样例:[4, 5, 1, 2, 3] -> [1, 2, 3, 4, 5]数组这一部分,很多题目是非常简单的,更多是考察对语言编写的能力,所以,我会在接下来好几节里,简洁快速地将这些题目过一遍,而不对算法细节做过多讲解(因为简单)。先看这道题目,旋转排序数组的问题,之前已经讲过(详见:点击打开链接)那个时候,是要寻找旋转排序数组的最小值

2016-05-13 15:28:48 1511

原创 加一

题目描述:给定一个非负数,表示一个数字数组,在该数的基础上+1,返回一个新的数组。该数字按照大小进行排列,最大的数在列表的最前面。样例:给定 [1,2,3] 表示 123, 返回 [1,2,4].给定 [9,9,9] 表示 999, 返回 [1,0,0,0].其实是两个链表求和的简单版(链表求和详见:点击打开链接)。简单表现在两个方面:1. 是数组,不是链表。数组的操作比链表简

2016-05-12 19:19:09 540

原创 奇偶分割数组

题目描述:分割一个整数数组,使得奇数在前偶数在后。样例:给定 [1, 2, 3, 4],返回 [1, 3, 2, 4]。想想在快速排序中,每一次递归是如何调整元素位置的。通过依次遍历,交换的方法,如果记不得了,可以点回去看看(详见:点击打开链接)所以,这个题类似,直接写出代码就行了:class Solution: # @param nums: a list of integ

2016-05-12 15:27:04 708

原创 最小子数组

题目描述:给定一个整数数组,找到一个具有最小和的子数组。返回其最小和。样例:给出数组[1, -1, -2, 1],返回 -3上一道题,已经讲过最大子数组是如何处理的了(详见:点击打开链接),这道题,稍微做一点修改即可。既然求最小,那么只要是大于0的前n位和就不能要。代码几乎和上一道题一模一样:class Solution: """ @param nums: a

2016-05-12 13:48:07 1132 1

原创 最大子数组

题目描述:给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。样例:给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6如果数组全是正数,那么最大子数组当然就是整个数组了。正因为穿插了负数,才让这道题有点难度。所以,思路是这样的:1. 依次求取前n位的和, 那么,当然有两种情况:和为正;和为负2. 如果和为

2016-05-12 13:21:28 1528 2

原创 复制带随机指针的链表

题目描述:给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点。返回一个深拷贝的链表。 首先,我先解释一下题目的意思。就是完全按照给出的链表的关系复制链表,比如,原链表中值为1的节点的next指向的是值为2的节点,随机指针指向值为3的节点,那么,复制之后,还是应该满足这样的指向关系,但是,因为是复制的链表,所以,存储在内存空间中的位置当然和原先不同。我们当然第

2016-05-11 18:52:09 3560

原创 子数组之和

题目描述:给定一个整数数组,找到和为零的子数组。你的代码应该返回满足要求的子数组的起始位置和结束位置样例:给出 [-3, 1, 2, -3, 4],返回[0, 2] 或者 [1, 3].求出和为0的子数组,穷举当然能解决。但是效率未免太低了。所以,我在这里用了一种以空间换取时间的办法:哈希表(所谓哈希表,在这里可简单理解成一个由键值对组成的列表,也就是python里面的字典)什么意思呢

2016-05-11 17:03:12 773

原创 两数之和

题目描述:给一个整数数组,找到两个数使得他们的和等于一个给定的数target。你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是1到n,不是以0开头。样例:numbers=[2, 7, 11, 15],  target=9, return [1, 2]可以先建立一个哈希表,键为数组中的元素,键所对应的值为数组的下标。这样的话,我们就

2016-05-11 11:11:12 1366 1

原创 快乐数

题目描述:写一个算法来判断一个数是不是"快乐数"。一个数是不是快乐是这么定义的:对于一个正整数,每一次将该数替换为他每个位置上的数字的平方和,然后重复这个过程直到这个数变为1,或是无限循环但始终变不到1。如果可以变为1,那么这个数就是快乐数。样例:19 就是一个快乐数。1^2 + 9^2 = 828^2 + 2^2 = 686^2 + 8^2 = 1001^2 + 0^2

2016-05-11 10:52:32 1231

原创 硬币排成线

题目描述:有 n 个硬币排成一条线。两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止。拿到最后一枚硬币的人获胜。请判定 第一个玩家 是输还是赢?样例:n = 1, 返回 true.n = 2, 返回 true.n = 3, 返回 false.n = 4, 返回 true.n = 5, 返回 true.好吧,我不得不承认,我并不知道这个题目考察的

2016-05-10 22:25:53 1092

原创 旋转链表

题目描述:给定一个链表,旋转链表,使得每个节点向右移动k个位置,其中k是一个非负数样例:给出链表1->2->3->4->5->null和k=2;返回4->5->1->2->3->null首先,观察一下这个题目要达到的目的,其实,换一种说法,可以这样来描述:给出一个k值,将链表从倒数第k个节点处起之后的部分移动到链表前面,就样例来说,其实是将4->5这一部分移动到整个链表前面,变成4->5-

2016-05-10 19:53:26 1971

原创 重排链表

题目描述:给定一个单链表L: L0→L1→…→Ln-1→Ln, 重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→…必须在不改变节点值的情况下进行原地操作样例:给出链表1->2->3->4->null,重新排列后为1->4->2->3->null。将L0,L1; L1,Ln-1;...排在一起,其实和回文链表(详见:点击打开链接)的逻辑是一样的,不同的是,回文链表是比较值,这里

2016-05-09 23:23:34 5124

原创 两个链表的交叉

题目描述:请写一个程序,找到两个单链表最开始的交叉节点。注意事项如果两个链表没有交叉,返回null;在返回结果后,两个链表仍须保持原有的结构;可假定整个链表结构中没有循环。两个链表交叉,其实就是在某一时刻,两个链表指向了同一个节点。那么,如果两个链表等长,这道题就毫无难度了,我们直接分别遍历两个链表,看在哪个节点处,两个链表的指向的节点是一样的。但是这道题并没有说链表等长,那也好办

2016-05-09 19:50:42 3809

原创 翻转链表 II

题目描述:翻转链表中第m个节点到第n个节点的部分;注意事项:m,n满足1 ≤ m ≤ n ≤ 链表长度样例:给出链表1->2->3->4->5->null, m = 2 和n = 4,返回1->4->3->2->5->null之前,已经实现过普通的,对于整个链表的翻转(详见:点击打开链接),这里增加了一点难度,设置了翻转的位置。但是基本方法没变。难度主要在于“摘链”和“链接”的

2016-05-09 14:28:51 1917

原创 回文链表

题目描述:设计一种方式检查一个链表是否为回文链表。样例:1->2->1 就是一个回文链表。当设计检查字符串是否为回文字符串的时候,可以用两个指针分别从头尾往中间遍历。但是链表不行,因为链表是不能往前回溯的。所以我们可以设计这样一个方法:将链表从中间断开,然后令其中一部分翻转,再从头至尾遍历两个链表即可。这里面找链表的中间节点的方法和链表翻转,我们都在之前的内容中讲过(详见:翻转链表

2016-05-07 22:52:21 2588 2

原创 删除排序链表中的重复数字 II

题目描述:给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素。样例:给出 1->2->3->3->4->4->5->null,返回 1->2->5->null;给出 1->1->1->2->3->null,返回 2->3->null还记得之前做过一道删除链表中重复元素的题(详见:点击打开链接),那道题中,我用了一个集合来存储出现过的元素,从而在遍历链表过程中决定节点的去留。但

2016-05-02 22:29:15 1190

原创 带环链表

题目描述:给定一个链表,判断它是否有环。样例:给出 -21->10->4->5, tail connects to node index 1,返回 true带环链表,只可能长成一下两种样子:因为一个节点,不可能有两个地址。所以,我们不妨先把这两种情况看做是两个跑道,那你想啊,如果有个比你跑得快的人,和你一起出发在跑道上跑,他迟早会套你的圈,左边这个图就不多说了,就是我们小时

2016-05-02 14:04:29 669

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除