第18章---高度难题 1,-------另类加法.实现加法. 另类加法 参与人数:327时间限制:3秒空间限制:32768K 算法知识视频讲解 题目描述 请编写一个函数,将两个数字相加.不得使用+或其他算数运算符. 给定两个int A和B.请返回A+B的值 测试样例: 1,2 返回:3 答案和思路:xor是相加不进位.and得到每一个地方的进位.所以,用and<<1之后去与xor异或.不断递归. import java.util.*; public class UnusualAdd { pu…
导语 所有的编程练习都在牛客网OJ提交,链接: https://www.nowcoder.com/ta/cracking-the-coding-interview 第八章 面试考题 8.1 数组与字符串 1.1 实现一个算法,确定一个字符串的所有字符是否全都不相同.假设不允许使用额外的数据结构,又该如何处理? 题解:应该先clarify上面的字符串是 ASCII 还是 unicode,假设是 ASCII,我们可以直接用256个字母表来统计.用个vector<int> st(256, 0)即可.…
写在开头 最近忙于论文的开题等工作,还有阿里的实习笔试,被虐的还行,说还行是因为自己的水平或者说是自己准备的还没有达到他们所需要人才的水平,所以就想找一本面试的书<Cracking the coding interview>,来练练手,顺带复习一下自己的基础知识,一些常用的数据结构,偶然在某位大神的blog里看到其分享的文章,还有他所做的解答,感觉自己的解答远没有他的简洁,且其解题都会优先考虑其空间和时间复杂度.本系列的文章只介绍,我做题过程中,遇到的一些好的思想方法,当然我会贴出一些代码.在…
Cracking the coding interview 第一章问题及解答 不管是不是要挪地方,面试题具有很好的联系代码总用,参加新工作的半年里,做的大多是探索性的工作,反而代码写得少了,不高兴,最近开始重新捡起面试题,来练练手,让自己保持代码的感觉. 代码主要是c的,可以避免使用容器之类的封装.因为使用c的话更能触及细节,而这也正是面试题所要考察的.同时,尽量为每道题添加了单元测试的用例. 代码是在windows下编辑运行的,只能保证在windows下正常运行,因为windows下的c编译器…
Cracking the Coding Interview(Trees and Graphs) 树和图的训练平时相对很少,还是要加强训练一些树和图的基础算法.自己对树节点的设计应该不是很合理,多多少少会有一些问题,需要找一本数据结构的书恶补一下如何更加合理的设计节点. ? class TreeNode { public:     int treenum;       TreeNode** children;     int child_num;     int child_len;     in…
Cracking the Coding Interview(Stacks and Queues) 1.Describe how you could use a single array to implement three stacks. 我的思路:一般堆栈的实现会利用一个数组,这里一个数组若实现3个堆栈,直接考虑把数组划分为3个部分,相当于3个独立的数组,所以就有以下的实现. 但是,这种实现方式的缺点在于均分了每个stack需要的space,但是事先无法确定每个stack是否需要更多的spac…
<Cracking the Coding Interview>是适合硅谷技术面试的一本面试指南,因为题目分类清晰,风格比较靠谱,所以广受推崇. 以下是我的读书笔记,基本都是每章的课后习题解答,其中不包括第15章. 相关源码在此repo中可以找到:https://github.com/zhuli19901106/Cracking-the-Coding-Interview <Cracking the Coding Interview>——第18章:难题——题目13 <Cracki…
前言 <Cracking the coding interview>是一本被许多人极力推荐的程序员面试书籍, 详情可见:http://www.careercup.com/book. 第六版中文版里面有189道程序员面试题目及相应的解答. 书中大部分是编程题目, 并且配有相应的java程序. 我把书中的题目做了一遍, 并且记录下来,包含自己对问题的一些思路及看法,许多问题给出了两种以上的解答方案. 由于个人在学习Go语言,所以程序是用Go 1.13编写,所有的代码都托管在Github上: htt…
3.栈与队列 3.1 描述如何只用一个数组来实现三个栈. 3.2 请设计一个栈,除pop与push方法,还支持min方法,可返回栈元素中的最小值.pop.push和min三个方法的时间复杂度必须为O(1). 3.3 设想有一堆盘子,堆太高可能会倒下来.因此,在现实生活中,盘子堆到一定高度时,我们就会另外堆一堆盘子.请实现数据结构SetOfStacks,模拟这种行为.SetOfStacks应该由多个栈组成,并且在前一个栈填满时新建一个栈.此外,SetOfStacks.push()和SetOfSta…
2014-04-29 04:36 题目:最大子数组和的二位扩展:最大子矩阵和. 解法:一个维度上进行枚举,复杂度O(n^2):另一个维度执行最大子数组和算法,复杂度O(n).总体时间复杂度为O(n^3),还需要O(n)额外空间. 代码: // 18.12 Given an n x n matrix, find the submatrix with largest sum. Return the sum as the result. #include <algorithm> #include &…
2014-04-29 04:30 题目:给定一个由‘0’或者‘1’构成的二维数组,找出一个四条边全部由‘1’构成的正方形(矩形中间可以有‘0’),使得矩形面积最大. 解法:用动态规划思想,记录二维数组每个元素向上下左右四个方向各有多少个连续的‘1’,然后用O(n^3)时间计算出满足条件的最大正方形.时间复杂度O(n^3),空间复杂度O(n^2). 代码: // 18.11 Given an NxN matrix of 0s and 1s, find out a subsquare whose a…
2014-04-29 00:15 题目:将二叉搜索树展开成一个双向链表,要求这个链表仍是有序的,而且不能另外分配对象,就地完成. 解法:Leetcode上也有,递归解法. 代码: // 17.13 Flatten a binary search tree into a doubly linked list by inorder traversal order. // Use postorder traversal to do the flattening job. #include <cstdi…
2014-04-25 20:47 题目:分配一个二维数组,尽量减少malloc和free的使用次数,要求能用a[i][j]的方式访问数据. 解法:有篇文章讲了六种new delete二维数组的方式,其中最后一种灰常高效.链接在此,解法六是巧妙的,不过里面的说法不对,而且还不标明转载原地址,可见这些技术网站的小编既不懂编程,也不尊重知识产权.没准这篇文章已经转载了无数次了.用这种方法创建和释放一个N维数组,只需要new和delete N次.我说的是N维,不是说长度.至于malloc和new的区别,…
2014-04-25 20:07 题目:为什么基类的析构函数必须声明为虚函数? 解法:不是必须,而是应该,这是种规范.对于基类中执行的一些动态资源分配,如果基类的析构函数不是虚函数,那么 派生类的析构函数在自动调用的时候,不会调用基类的析构函数,这样就会造成资源未释放引起的内存泄漏. 代码: // 13.6 If a class is defined as base class, why must its destructor be declared "virtual"? // Ans…
2014-04-25 19:29 题目:对比一下哈希表和STL中的map的区别,哈希表如何实现?如果数据规模比较小,可以用什么来代替哈希表? 解法:哈希表可以理解为一堆桶,每个桶都有唯一的id,桶里可以存至少一个元素:而STL的map是一棵平衡二叉搜索树,每个节点存一个元素.还有很多细节要说,如果on-site面试的话,也许可以写写画画,或者直接写出一个简单的哈希表来,参考unordered_map.如果数据规模小的话,直接用数组就可以了.之前有一道题让实现一个哈希表,所以在这儿就不重复写一次了…
2014-03-21 22:23 题目:假设你一开始有一个空数组,你在读入一些整数并将其插入到数组中,保证插入之后数组一直按升序排列.在读入的过程中,你还可以进行一种操作:查询某个值val是否存在于数组中,并给出这个元素在数组中的位置(如果有多个的重复元素话,给出最小的下标). 解法:书上的原题不是这么描述的,但我觉得用这种插入排序的说法更好理解.虽然说是数组,但实际上既可以用真的数组来模拟这一过程,也可以用一棵二叉搜索树来做.我的实现是用二叉搜索树,每个节点里除了记录元素的值之外,还记录它的左…
2014-03-21 21:50 题目:给定一个MxN的二位数组,如果每一行每一列都是升序排列(不代表全展开成一个一维数组仍是升序排列的).请设计一个算法在其中查找元素. 解法:对于这么一个数组,有两点是确定的:1. 左上最小,右下最大:2. 左边不大于右边,上边不大于下边.根据这么个思路,你可以从左下或者右上开始查找,应该向左走向右走,还是向上走向下走,你懂的.用这种方法,可以在线性的时间内找出一个元素. 代码: // 11.6 Given an MxN matrix, each row an…
2014-03-21 20:55 题目:给定一个旋转过的升序排序好的数组,不知道旋转了几位.找出其中是否存在某一个值. 解法1:如果数组的元素都不重复,那么我的解法是先找出旋转的偏移量,然后进行带偏移量的二分搜索.两个过程都是对数级的. 代码: // 11.3 Given a sorted array rotated by a few positions, find out if a value exists in the array. // Suppose all elements in th…
2014-03-20 02:24 题目:给定二位平面上一堆点,找到一条直线,使其穿过的点数量最多. 解法:我的解法只能适用整点,对于实数坐标就得换效率更低的办法了.请参见LeetCode - Max Points on a Line - zhuli19901106 - 博客园. 代码: // 7.6 Find the line that crosses the most points. #include <unordered_map> #include <vector> using…
2014-03-20 02:20 题目:给定二维平面上两个正方形,用一条直线将俩方块划分成面积相等的两部分. 解法:穿过对称中心的线会将面积等分,所以连接两个中心即可.如果两个中心恰好重合,那么任意穿过这个点的直线都满足条件. 代码: // 7.5 Given two squares on two-dimensional plane, draw a line to cut them in two parts with equal area. // Answer: // Apparently th…
2014-03-20 02:05 题目:给定笛卡尔二维平面上两条直线,判断它们是否相交. 解法:相交.重合.平行. 代码: // 7.3 Given two lines on the Cartesian, determine if they would intersect. #include <cstdio> using namespace std; int main() { // a * x + b * y + c = 0; // d * x + e * y + f = 0; int a,…
2014-03-19 06:27 题目:有一个数组里包含了0~n中除了某个整数m之外的所有整数,你要设法找出这个m.限制条件为每次你只能用O(1)的时间访问第i个元素的第j位二进制位. 解法:0~n的求和有公式可循,只要把所有数都加起来就能知道缺少的m是几了.书本提供了一种比较高效的解法,我仔细读了以后觉得书上给的优化算法实际上需要额外的空间来支持,coding难度偏高,临场的话我估计挺难写出来的. 代码: // 5.7 Find the missing integer from 0 to n,…
2014-03-19 04:16 题目:找出一棵二叉搜索树中的中序遍历后继节点,每个节点都有指针指向其父节点. 解法1:分两种情况:向下走时,先右后左:向上走时,先左后右.如果目标节点有右子树,就向右下走,否则往左上走.话说,如果没有父指针的话,还是一口气进行各中序遍历,求出所有结果比较有效率. 代码: // 4.6 Find the inorder successor of a node in the binary tree. // online algorithm with parent p…
2014-03-19 04:11 题目:设计算法检查一棵二叉树是否为二叉搜索树. 解法:既然是二叉搜索树,也就是说左子树所有节点都小于根,右子树所有节点都大于根.如果你真的全都检查的话,那就做了很多重复工作.只需要将左边最靠右,和右边最靠左的节点和根进行比较,然后依照这个规则递归求解即可. 代码: // 4.5 Check if a binary tree is binary search tree. #include <cstdio> using namespace std; struct…
2014-03-19 03:34 题目:给定一个排好序的数组,设计算法将其转换为一棵二叉搜索树,要求树的高度最小. 解法:递归生成平衡二叉树,使左右子树的节点数尽量相等,所以对半开最好了.其实也可以生成一棵完全二叉树,不过写法应该不是很方便. 代码: // 4.3 Convert sorted unique array to height-balanced binary search tree. #include <cstdio> using namespace std; struct Tre…
1.数组与字符串 1.1 实现一个算法,确定一个字符串的所有字符是否全都不同.假设不允许使用额外的数据结构,又该如何处理? 1.2 用C或C++实现void reverse(char* str)函数,即反转一个null结尾的字符串. 1.3 给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串. 1.4 编写一个方法,将字符串中的空格全部替换为"%20".假设该字符串尾部有足够的空间存放新增字符,并且知道字符串的"真实"长度.示例:输…
Design an algorithm to find the kth number such that the only prime factors are 3,5 and 7 方法一: a[i]=min{a[s1]*3,a[s2]*5,a[s3]*7}; s1<i,s2<i,s3<i   &&    a[s1]*3>a[i-1],a[s2]*3>a[i-1],a[s3]*7>a[i-1] 时间复杂度O(n^2) #include<stdio.h…
#include <iostream> #include <cstdio> #include <vector> #include <stack> #define ls(x) (((x + 1)<<1) - 1) #define rs(x) ((x + 1)<<1) using namespace std; ; typedef struct Node{ struct Node *left; struct Node *right; int…
1. Arrays and Strings 1.1 Hash Tables 哈希表,简单的说就是由一个数组和一个hash函数组成实现key/value映射并且能高效的查找的数据结构.最简单的想法就是将hash(key)做为数组的下标(index)来存取. 但是为了防止hash的冲突(collisions),数组的大小必须设置得足够大,因此上面这种简单的实现在实际中是不可取的. 实际上,哈希表是一个固定大小的数组,数组的每个元素是一个链表(单向或双向)的头指针.每个元素被存放在hash(key)%…
文章的缘由可以参考此篇文章.目前完成了第二章,代码放在github上,地址在此.问题的描述都在对应的代码文件中.其他的章节仍在在进行中. 如果代码有问题,欢迎指正,谢谢. yetuweiba…