刷《剑指offer》笔记】的更多相关文章

2019/07/28开始刷每天6题,一共66题,刷三遍,9月1号完成. 1.二维数组中的查找: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 最开始的思路: # -*- coding:utf-8 -*- class Solution: # array 二维列表,其实就是矩阵 def Find(self, target, array): # write…
1.在定义类的赋值描述符成员函数时,有以下几点要注意: 1)判断是否是自己赋值给自己 2)返回值是const类的引用(为了连续赋值) 3)参数是const类的引用 4)如果数据成员中有指针,注意要深拷贝,且要释放之前指针指向的内存. 2.类的拷贝构造函数,一定不能使用该类型的变量做参数,会无法通过编译的.因为如果使用变量,形参和实参之间要拷贝,拷贝又会调用拷贝构造函数,这就陷入死循环,直到内存泄露. 3.…
题目:设计一个类,我们只能生成该类的一个实例. 解法一:单线程解法 //缺点:多线程情况下,每个线程可能创建出不同的的Singleton实例 #include <iostream> using namespace std; class Singleton { public: static Singleton* getInstance() { if(m_pInstance == nullptr) { m_pInstance = new Singleton(); } return m_pInsta…
题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数. class CMyString{ public: CMyString(char* pData = nullptr); CMyString(const CMyString& str); ~CMyString(void); private: char* m_pData; }; 注意点: 是否把返回值的类型声明为该类型的引用,并在函数结束前返回实例自身的引用(*this).只有返回一个引用,才可以允许连续赋值.否则,如果函数的返…
题目一:找出数组中重复的数字.在一个长度为n的数组里的所有数字都在0~n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数字.例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字2或者3. 测试用例: 长度为n的数组里包含一个或多个重复的数字. 数组中不包含重复的数字. 无效输入测试用例(输入空指针:长度为n的数组中包含0~n-1之外的数字) 测试代码: void test(cha…
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 测试用例: 二维数组中包含查找的数字(查找的数字是数组中的最大值和最小值:查找的数字介于数组中的最大值和最小值之间). 二维数组中没有查找的数字(查找的数字大于数组中的最大值:查找的数字小于数组中的最小值:查找的数字在数组的最大值和最小值之间但数组中没有这个数字). 特殊输入测试(输入空指针). 测试代码: /* ***数字…
题目:请实现一个函数,把字符串中的每个空格替换成"20%".例如,输入"We are happy."则输出"We%20are%20happy.". 注意:看到这个题目,我们首先应该想到的是原来一个空格字符,替换之后变成'%'.'2'和'0'这3个字符,因此字符串会边长.如果是在原来的字符串上进行替换,就有可能覆盖修改在该字符串后面的内存.如果是创建新的字符串并在新的字符串上进行替换,那么我们可以自己分配足够多的内存.由于有两种不同的解决方案,我们…
题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值.链表节点定义如下: struct ListNode{ int m_nKey; ListNode* m_pNext; } 测试用例: 功能测试(输入的链表有多个节点:输入的链表只有一个节点). 特殊输入测试(输入的链表头结点指针为nullptr). 测试代码: void Test(ListNode* pHead) { PrintList(pHead); PrintListReversingly_Iteratively(pHead); p…
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如,输入前序遍历序列{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历序列{4, 7, 2, 1, 5 3, 8, 6},则重建如下图所示的二叉树并输出它的头结点.二叉树的节点的定义如下: struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; /…
题目:给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左.右子节点的指针,还有一个指向父节点的指针. 测试用例: 普通二叉树(完全二叉树,不完全二叉树). 特殊二叉树(所有节点都没有右子节点的二叉树:所有节点都没有左子节点的二叉树:只有一个节点的二叉树:二叉树的根节点指针为nullptr). 不同位置的节点的下一个节点(下一个节点为当前节点的右子节点.右子树的最左子节点.父节点.跨层的父节点等:当前节点没有下一个节点). 测试代码: void Tes…
题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在尾部插入节点和在队列头部删除节点的功能. 测试用例: 往空的队列里添加.删除元素. 往非空的队列里添加.删除元素. 连续删除元素直至队列为空. 测试代码: void test(char actual, char expected){ if(actual == expected) printf("test passed.\n"); else printf("tes…
题目:求斐波那契数列的第n项.写一个函数,输入n,求斐波那契数列的第n项.斐波那契数列的定义如下:f(0) = 0, f(1) = 1,f(n) = f(n - 1) + f(n - 2). 测试用例: 功能测试(如输入3.5.10等). 边界值测试(如输入0.1.2). 性能测试(输入较大的数字,如40.50.100等). 测试代码: void test(int n, int expected){ if(fibonacci_solution1(n) == expected) printf("t…
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数字的最小值为1. 测试用例: 功能测试(输入的数组是升序排序数组的一个旋转,数组中有重复数字或者没有重复数字). 边界值测试(输入的数组是一个升序排序的数组,只包含一个数字的数组). 特殊输入测试(输入nullptr指针). 测试代码: void Test(int* numbers…
题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格.如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子.例如,在下面的3x4的矩阵中包含一条字符串"bfce"的路径(路径中的字母用下画线标出).但矩阵中不包含字符串"abfb"的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子. a b t g c f c s…
题目:地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移动,它每次可以向左.右.上.下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子.例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7=18.但它不能进入方格(35,38),因为3+5+3+8=19.请问该机器人能够到达多少个格子? 测试用例: 功能测试(方格为多行多列:k为正数). 边界值测试(方格只有一行或者只有一列:k等于0). 特殊输入测试(k为负数). 测试代码: void test(ch…
题目:给你一根长度为n的绳子,请把绳子剪成m段(m,n都是整数,n > 1 并且m > 1),每段绳子的长度记为k[0], k[1], ...k[m].请问k[0] x k[1] x ... x k[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2.3.3的三段,此时得到的最大乘积是18. 测试用例: 功能测试(绳子的初始长度大于5). 边界值测试(绳子的初始长度分别为0.1.2.3.4). 测试代码: void test(const char* testName,…
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 牛客网链接 思路 链接:https://www.nowcoder.com/questionTerminal/e02fdb54d7524710a7d664d082bb7811?f=discussion 来源:牛客网 首先:位运算中异或的性质:两个相同数字异或=0,一个数和0异或还是它本身. 当只有一个数出现一次时,我们把数组中所有的数,依次异或运算,最后剩下的就是落单的数,因为成对儿出现的都抵消…
题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大的数组靠前) 牛客网链接 java代码 import java.util.ArrayList; /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(…
题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 牛客网链接 java代码 import java.lang.Math; public class Solution { public boolean IsBalanced_Solution(TreeNode root) { if (root == null) return true; return getDeepth(root) != -1; } private int getDeepth(TreeNode root) { if (roo…
题目描述 统计一个数字在排序数组中出现的次数. 牛客网链接 java代码 //看见有序就用二分法 public class Solution { public int GetNumberOfK(int [] array , int k) { int len = array.length; if (len == 0) return 0; int low = getFirst(array, k, 0, len-1); int high = getEnd(array, k, 0, len-1); if…
题目描述 输入两个链表,找出它们的第一个公共结点. 牛客网链接 js代码 /*function ListNode(x){ this.val = x; this.next = null; }*/ function FindFirstCommonNode(pHead1, pHead2) { // write code here let len1 = FindLength(pHead1) let len2 = FindLength(pHead2) if (len1 > len2) { pHead1 =…
题目描述 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%100的数据,size<=2*10^5 牛客网链接 思路 链接:https://www.nowcoder.com/que…
题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 牛客网链接 js代码 function FirstNotRepeatingChar(str) { // write code here let map = new Map() for (let i of str) { if (map.get(i) === undefined) map.set(i, 1) else map.set(i,…
题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 思路 通俗易懂的解释: 首先从丑数的定义我们知道,一个丑数的因子只有2,3,5,那么丑数p = 2 ^ x * 3 ^ y * 5 ^ z,换句话说一个丑数一定由另一个丑数乘以2或者乘以3或者乘以5得到,那么我们从1开始乘以2,3,5,就得到2,3,5三个丑数,在从这三个丑数出发乘以2,3,5就得到4,6…
题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 思路 对vector容器内的数据进行排序,按照 将a和b转为string后 若 a+b<b+a a排在在前 的规则排序, 如 2 21 因为 212 < 221 所以 排序后为 21 2 to_string() 可以将int 转化为string 牛客网链接 js代码 function PrintMinNumb…
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数). 思路 像类似这样的问题,我们可以通过归纳总结来获取相关的东西. 首先可以先分类: 个位 我们知道在个位数上,1会每隔10出现一次,例如1.11.21等等,我们发现以10为一个…
题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1) 思路 使用动态规划 F(i):以array[i]…
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 牛客网链接 js代码 function GetLeastNumbers_Solution(input, k) { // write code here const res = [] if (input.length === 0) return res if (k > input.length) return res let temp for (let i = 0;…
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. 思路 思路二:如果有符合条件的数字,则它出现的次数比其他所有数字出现的次数和还要多. 在遍历数组时保存两个值:一是数组中一个数字,一是次数.遍历下一个数字时,若它与之前保存的数字相同,则次数加1,否则次数减1:若次数为0,则保存下一个数字,并将次数置为1.遍历结束后,所保存的数…
题目描述 题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. 思路 基于回溯法思想 牛客网链接 js代码 function Permutation(str) { // write code here if (str === '') return [] let arr = str.s…