自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 收藏
  • 关注

原创 程序员代码面试指南 001-020

文章目录001 在行列都排好序的矩阵中找指定的数002 最长的可整合子数组的长度001 在行列都排好序的矩阵中找指定的数题目 代码题目要求O(m + n)的复杂度,也就是说最多遍历一行和一列。根据矩阵有序的特点,可以根据当前元素和K值的大小关系进行查找。从右上角和左下角查找应该都可以,因为两个方向的大小关系是不同的,而左上和右下就不行了。002 最长的可整合子数组的长度题目 代码题目要...

2020-03-31 23:33:11 328

原创 程序员面试金典 3.6

Animal Shelter:动物收容所只收留猫和狗,并且严格按照先进先出的规则。人们指只能领养最早进入动物收容所的动物,但是可以选择领养猫还是领养狗。如果将猫狗放在一个队列中,那么dequeueAny()是最容易实现的,但是dequeueDog和dequeueCat就麻烦了,必须要遍历队列进行选择,所以将猫和狗放在两个队列里更合适一些,这样可以根据收留的时间对猫和狗进行排序。此时dequeue...

2020-03-31 20:07:05 287

原创 程序员面试金典 3.5

Sort Stack:实现一个对栈进行排序的程序,使得最小元素在栈顶,只能使用一个辅助栈。基本解法类似选择排序,依次从栈中找出最小的元素,然后放入一个新的栈中。这种解法需要使用3个栈,一个原始栈,一个暂存栈和一个结果栈。除了冒泡排序,还可以使用插入排序,将原始栈的栈顶元素插入到结果栈中合适的位置,这种算法的时间复杂度为O(N ^ 2),空间复杂度为O(N)。如果能使用更多的栈,也可以尝试归并...

2020-03-31 19:45:10 225

原创 程序员面试金典 3.4

Queue via Stacks:使用两个栈实现队列。队列的特点是先进先出,栈的特点是先进后出,所以pop()操作应该和入栈顺序相反,这样第二个栈就派上用场了。在pop()时可以将元素全部导入第二个栈中,然后对第二个栈进行pop()操作,最后再将元素全部倒回去。这种方法虽然可行,但是来回倒腾元素会产生很多无意义的操作,所以可以采取较为懒惰的方法,让元素在第二个栈里先放着。和程序员代码面试指南 ...

2020-03-31 18:11:49 240

原创 程序员面试金典 3.3

Stack of Plates:在堆盘子的时候,如果一摞盘子过高就有可能????了,所以在达到一定高度时需要新起一摞。写一个程序模拟这个过程,并提供一个popAt()函数,可以拿走指定一摞中的盘子。书上提供的popAt()函数是这样的:在拿走指定一摞中的盘子后,要把后面一摞盘子中最下面的盘子挪到最上面,直到这是最后一摞盘子,但是力扣上的示例2显示并不要求这么做,只需要在这一摞空的时候移除这一摞就可以了...

2020-03-30 22:32:16 155

原创 程序员面试金典 3.2

Stack Min:设计一个带有min函数的栈,可以以O(1)的时间返回栈中的最小值。和程序员代码面试指南 005题是一样的,

2020-03-29 22:52:08 162

原创 程序员面试金典 3.1

Three in One:使用一个数组实现3个栈。书上给了两种方法,一种固定每个栈的大小,另外一种动态改变栈的大小。动态改变栈大小时,3个栈的总大小不变,但是每个栈可以根据元素数量动态使用其它栈的空间。力扣上的明确指出push操作遇到栈满时不压入元素,所以动态的方法也没啥用了。固定大小的方法中,使用StackInfo记录栈底和栈顶,top为栈顶元素的下一个位置。class TripleInO...

2020-03-28 21:44:17 185

原创 程序员面试金典 2.8

Loop Detection:判断链表中是否存在环,如果存在环则返回环的起始节点。书上说了那么多,总结起来就是下面几点:使用快慢指针遍历链表,如果快慢指针相遇则存在环然后将慢指针重新定位到起始节点,快指针位置不变最后快慢指针以步长为1遍历链表,新的相遇点就是环的起始节点为什么是对的呢?设环的大小为LOOP_SIZE。假设慢指针走了k步后到了环的入口,此时快指针走了2k步,也就是快指针...

2020-03-27 22:13:38 154

原创 程序员面试金典 2.7

Intersection:判断两个链表是否相交,相交定义为两个指针指向同一个节点,而不是两个链表的某个后缀值是相等的。如果两个链表的尾节点是同一块内存,则两个链表必定相交。在相交的情况下,可以从尾结点往回遍历找相交点。但不幸的是这是单链表,没法回溯,即使用递归的方法,也会因为链表不等长而无法回溯。所以需要让两个链表等长。可以先通过一次遍历求出两个链表的长度,然后跳过较长链表前面的一些节点,最后...

2020-03-27 21:31:48 158

原创 程序员面试金典 2.6

Palindrome:判断一个链表是否是回文链表。最简单的方式就是构造一个逆序的单链表,然后通过遍历来判断原始链表和反转的链表是否相同。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val...

2020-03-26 21:59:45 145

原创 程序员面试金典 2.5

Sum Lists:将两个单链表所表示的十进制数求和,数位是逆序的,也就是个位是第一个节点。如果个位最后一个节点又该如何做呢?当数字以小端序存储时,只需编写代码模拟加法计算过程就可以了,下面是我经常使用的迭代方法。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListN...

2020-03-25 12:00:25 159

原创 程序员面试金典 2.4

Partition:编写代码,将链表中小于x的元素放在链表的前半部分,大于x的元素放在链表的后半部分,没有顺序要求。如果是数组的话,根据x对数组进行划分的方法类似于快排。对于链表会更简单一些,可以直接将原始链表拆分为两个链表,一个中所有元素比x小,一个钟所有元素比x大,最后再进行连接。通过在链表中使用beforeStartNode和afterStartNode作为头结点,可以简化插入的过程,同...

2020-03-24 14:09:07 157

原创 程序员面试金典 2.3

Delete Middle Node:在只能访问该节点的情况下,删除单链表中的该节点。把下一个节点的数据拷贝到当前节点,然后删除后一个节点就好了。如果是尾节点,那肯定是没法删除的。这题在逗我玩吧。。。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *n...

2020-03-23 18:01:00 155

原创 程序员面试金典 2.2

Return Kth to Last:返回单链表中倒数第k个元素。下面会分别使用递归和非递归的方法来解决这道题,一般来说递归的方法写起来更容易,但是效率一般不是最好的,比如这道题递归解法的复杂度大约是非递归解法的一半,但是时间复杂度依然是O(N)。递归解法。这种方法的本质是先遍历到链表尾部,最后再返回的过程中找到第k个。设链表的头为head,要在head的链表中查找倒数第k个元素,就是在hea...

2020-03-23 14:53:47 269

原创 程序员面试金典 2.1

Remove Dups:删除未排序链表中的重复元素。如果不使用额外的存储空间应该怎么做?为了删除链表中的重复元素,必须要对链表进行遍历。可以将已经遍历过的元素存储在一个集合中,如果再次出现相同的元素,就将其删除。这种方法的时间复杂度为O(n)。/** * Definition for singly-linked list. * struct ListNode { * int va...

2020-03-23 13:50:19 178

原创 程序员面试金典 1.9

String Rotation:假设函数isSubString(str1, str2)可以判断str2是否是str1的子串。给定两个字符串s1和s2,判断s1循环左移后,是否可以得到s2,例如,waterbottle循环左移3位后可以得到erbottlewat。假如只调用一次isSubString()可以实现吗?当s1循环移位后可以得到s2时,本质上是将s1一分为二,然后将前面一部分接到后面一部...

2020-03-22 21:25:44 241

原创 程序员面试金典 1.8

Zero Matrix:给定一个矩阵,将矩阵中0元素所在的行和列清零。乍看这道题还是很简单的:遍历矩阵中的元素,如果出现0就将对应的行列清零。但是这样做是有问题的,当后续遍历到被清零的元素时,会继续清零,这样只要矩阵中有一个0,那么最终整个矩阵都会被清零。所以我们必须进行两次遍历,第一次遍历对每个位置进行标记,第二次遍历才清零,这样需要的空间复杂度为O(MN)。但是其实只需要知道需要将哪一行...

2020-03-22 18:11:37 178

原创 程序员面试金典 1.7

Rotate Matrix:给定一个N * N的矩阵,将矩阵顺时针旋转90度。是否可以原地旋转呢?最简单的方法就是由外到内按层进行旋转,将上面的转到右面,右面的转到下面,下面的转到左面,左面的转到上面。可以把上面的一行先拷贝到一个临时空间中,然后依次把左面的一列拷贝到上面的一行,下面的一行拷贝到左面的一列,右面的一列拷贝到底面的一行,最后再将临时空间中的一行拷贝到右边的一列。这种方法需要额外的...

2020-03-22 12:55:38 172

原创 程序员面试金典 1.6

String Compression:通过将字符串中连续的字符使用数字替代可以对字符串进行压缩,例如aabcccccaaa可以压缩为a2b1c5a3。如果压缩后的字符串比原始字符串长,则不进行压缩。假设字符串中只包含字母。直观解法很简单,但是写起来可能会很无聊。遍历字符串,将每个字符拷贝到一个新的缓冲区中,并进行计数。class Solution {public: string co...

2020-03-21 11:58:09 196

原创 程序员面试金典 1.5

One Away:字符串有3种编辑操作,分别是插入、删除和替换。判断两个字符串是否可以通过一次编辑互相转换。可以使用暴力搜索的方法,将和某一个字符串编辑距离为1的所有字符串枚举出来,然后再比较,也就是说用其余字符替换每一个字符,插入每一个可能的字符。但是这种方法太慢了,这里就不实现了。...

2020-03-21 11:24:27 152

原创 程序员面试金典 1.4

Palindrome Permutation:判断一个字符串是否可以组成一个回文字符串。首先要想想回文串有什么特点,至少所有的字符都应该有偶数个,这样才能一边一半,然后最中间的字符可以只出现奇数次,所以可以给出下面的解法:使用一个数组来记录每个字符出现的次数,最后算一下奇数的个数,时间复杂度为O(n)。class Solution {public: bool canPermutePa...

2020-03-19 17:29:46 174

原创 程序员面试金典 1.3

URLify:写一个程序,将字符串中的空格替换为%20,可以假设字符串尾部有足够的空间,输入参数还包括字符串的实际长度。一个比较常见的解法就是将字符向尾部移动。因为尾部有足够的空间,所以不用担心会覆盖原始字符。通过两次遍历可以实现这种解法。第一次遍历计算空格的数量,然后乘3(原文错误,应该是2)就可以算出需要的额外空间。第二次遍历从原始字符串尾部开始,如果是空格,就用%20替换,否者直接拷贝到...

2020-03-18 18:20:46 173

原创 程序员面试金典 1.2

Check Permutation:给定两个字符串,判断其中一个是否是另一个的排列。首先还是应该向面试官确定几个细节问题,大小写是否敏感,以及是否忽略空白。这道题假设大小写敏感,不忽略空白。首先可以确定如果两个字符串长度不同则肯定返回false。下面的两种解法都利用了这一个优化。如果两个字符串互为排列,那么有相同种类的字符,但是顺序不同,所以通过排序可以将两个字符串变成相同顺序的,然后只需比...

2020-03-17 17:43:21 240

原创 程序员面试金典 1.1

买了书之后发现配书网站上不去,然后就吃灰了,今天偶然发现leetcode可刷。Is Unique:实现一个算法,判断一个字符串中所有的字符是否都不同。如果不能使用任何额外数据结构又该怎么做呢?首先你应该问面试官:字符串是ASCII的还是Unicode的?这个问题可以展示出你有很强的计算机科学素养。为了简单这里假设是ASCII的。一个朴素的解法是创建一个bool类型的数组,元素i表示字符i是否...

2020-03-16 18:02:16 468

原创 算法竞赛入门经典 例题9-8

UVa 01625Color Length某个城市因为修路,需要将上下两车道关闭为上下单车道,即每个方向需要将两车道的车流合并到一条车道中。每辆车的颜色用大写字母表示,要求合并后的车流中每种颜色车的最大距离之和最小,例如合并后的车流为GBYBRYRGB,则距离分别为L(G) = 7,L(B) = 7,L(Y) = 3,L(R) = 2,和为19。每一步要做的决策就是从第1条车道,或者第2条车...

2020-03-15 23:03:36 91

原创 算法竞赛入门经典 例题9-7

UVa 11584Partitioning by Palindromes将一个字符串进行划分,使得划分后的每一部分都是回文字符串,求给定字符串的最小划分。假设已经找到了前end个字符的最小划分,现在加入第end + 1个字符,可以将第end + 1个字符作为结尾,向前寻找所有可能的回文串,设回文串的起点为begin,那么可以将str[begin] ~ str[end + 1]作为一个新的划分...

2020-03-13 18:56:05 158

原创 算法竞赛入门经典 例题9-6

UVa11400Lighting System Design一个照明系统要使用n种不同的灯泡,每种灯泡需要的数量为L,价格为C。同时每种灯泡都需要一个特定的电压源,该电压源能提供的电压为V,价格为K。为了省钱,可以将低电压的灯泡换成高电压的灯泡,这样就能利用灯泡的差价节省电压源的价格。省钱的办法是利用灯泡之间的差价以减少电压源的开销,并且只有当某一种灯泡被全部替换后才能省下该种电压源的钱。例...

2020-03-13 17:58:15 137

原创 算法竞赛入门经典 例题9-5

UVa 12563Jin Ge Jin Qu hao这题的背景我也是服了。。。虽然KTV没少去,但是我真的没发现还有这种骚操作:时间到了之后是不会立即播放《拒绝黄赌毒》的,而是可以把这首歌唱完。如果选择唱一首《劲歌金曲》(并不是jin),那么就能多唱10分钟,所以你可以算算在所剩不多的时间t里,最多还能唱几首,以及最多还能唱多长时间。这是一个背包问题,可以简述为有n首歌,每首歌只能唱1次,...

2020-03-11 23:20:54 148

原创 算法竞赛入门经典 例题9-3

UVa 01347TourJohn Doe准备去n个地方旅游,然后再回到起点。他租了一架飞机。为了省钱,他要保证每个地方只去一次,另外他打算到最远地方后才往回飞,所以需要计算出一个最短的闭环路径。假如现在在第i个景点,那么下一次可以飞向任何一个更远的景点。虽然这一步的选择在当下没有什么影响,但是会影响到回来时的选择,所以这一步的决策应该兼顾到回来的路线。假如直接飞往第i + 2个景点,那么第...

2020-03-11 17:11:48 152

原创 算法竞赛入门经典 例题9-2

UVa 00437The Tower of Babylon有长宽高分别为x[i]、y[i]和z[i]的立方体,每种的数量有无限个,求摞起后能得到的最大高度,限制条件是上面立方体底面的长和宽严格小于下面立方体顶面的长和宽。比较简单的一道动态规划题目,只需要将立方体依次摞上去就可以了,但是要注意的就是如何表示状态,还是需要和上一道一样进行转化。如果直接以#include <iostrea...

2020-03-10 22:35:53 116

原创 算法竞赛入门经典 例题9-1

UVa 01025A Spy in the Metro时隔3个月后又开始了刷题,因为有用的书都在学校,所以只能再挑《算法竞赛入门经典(第2版)》中有用的题目来做一做了。一条地铁线路有N个车站,Maria从始发站上车,任务是在T时刻在终点站会见一个间谍。因为这是秘密行动,如果在站台上等车时间过长,就会被特工逮捕,因此她必须尽可能少的停留在站台上,即使需要来回的乘车。之前总结的动态规划解题方法...

2020-03-10 15:05:25 337 5

空空如也

空空如也

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

TA关注的人

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