04 2020 档案
摘要:1.前序遍历 前序遍历:先遍历根节点,再遍历左子树,最后遍历右子树(根-左-右) 测试代码: // 二叉树的三种遍历 // 1.前序遍历 // 2.中序遍历 // 3.后序遍历 #include <cstdio> #include <stack> #include <vector> #include
阅读全文
摘要:0、算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时
阅读全文
摘要:// 面试题68:树中两个结点的最低公共祖先 // 题目:输入两个树结点,求它们的最低公共祖先。 #include <cstdio> #include "Tree.h" #include <list> using namespace std; // 得到树结点的路径 bool GetNodePath
阅读全文
摘要:// 面试题67:把字符串转换成整数 // 题目:请你写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不 // 能使用atoi或者其他类似的库函数。 #include <cstdio> long long StrToIntCore(const char* str, bool min
阅读全文
摘要:// 面试题66:构建乘积数组 // 题目:给定一个数组A[0, 1, …, n-1],请构建一个数组B[0, 1, …, n-1],其 // 中B中的元素B[i] =A[0]×A[1]×… ×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。 #include <cstdio> #inc
阅读全文
摘要:// 面试题65:不用加减乘除做加法 // 题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷ // 四则运算符号。 #include <cstdio> int Add(int num1, int num2) { int sum = 0; //和 int carry = 0; /
阅读全文
摘要:// 面试题64:求1+2+…+n // 题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case // 等关键字及条件判断语句(A?B:C)。 #include <cstdio> // 方法一 // 利用构造函数求解 class Temp { publ
阅读全文
摘要:// 面试题63:股票的最大利润 // 题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖交易该股 // 票可能获得的利润是多少?例如一只股票在某些时间节点的价格为{9, 11, 8, 5, // 7, 12, 16, 14}。如果我们能在价格为5的时候买入并在价格为16时卖出,则能 /
阅读全文
摘要:// 面试题62:圆圈中最后剩下的数字 // 题目:0, 1, …, n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里 // 删除第m个数字。求出这个圆圈里剩下的最后一个数字。 #include <cstdio> #include <list> using namespace std; /
阅读全文
摘要:// 面试题61:扑克牌的顺子 // 题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。 // 2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字。 #include <cstdio> #include <cstdlib> int Compa
阅读全文
摘要:// 面试题60:n个骰子的点数 // 题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s // 的所有可能的值出现的概率。 #include <cstdio> #include <math.h> int g_maxValue = 6; // 方法一 void Probabi
阅读全文
摘要:// 面试题59(二):队列的最大值 // 题目:请定义一个队列并实现函数max得到队列里的最大值, // 要求函数max、push_back和pop_front的时间复杂度都是O(1) #include <cstdio> #include <deque> #include <exception>
阅读全文
摘要:// 面试题59(一):滑动窗口的最大值 // 题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如, // 如果输入数组{2, 3, 4, 2, 6, 2, 5, 1}及滑动窗口的大小3,那么一共存在6个 // 滑动窗口,它们的最大值分别为{4, 4, 6, 6, 6, 5},
阅读全文
摘要:// 面试题58(二):左旋转字符串 // 题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。 // 请定义一个函数实现字符串左旋转操作的功能。比如输入字符串"abcdefg"和数 // 字2,该函数将返回左旋转2位得到的结果"cdefgab"。 #include <cstdio
阅读全文
摘要:// 面试题58(一):翻转单词顺序 // 题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。 // 为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ", // 则输出"student. a am I"。 #include <cstdio>
阅读全文
摘要:// 面试题57(二):为s的连续正数序列 // 题目:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。 // 例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5、 // 4~6和7~8。 #include <cstdio> void
阅读全文
摘要:// 面试题57(一):和为s的两个数字 // 题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们 // 的和正好是s。如果有多对数字的和等于s,输出任意一对即可。 #include <cstdio> bool FindNumbersWithSum(int data[], int
阅读全文
摘要:// 面试题56(二):数组中唯一只出现一次的数字 // 题目:在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次。请 // 找出那个吃出现一次的数字。 #include <cstdio> #include <exception> int FindNumberAppearingOnce(i
阅读全文
摘要:// 面试题56(一):数组中只出现一次的两个数字 // 题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序 // 找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 #include <cstdio> unsigned int FindFirstBit
阅读全文
摘要:// 面试题55(二):平衡二叉树 // 题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中 // 任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。 #include <cstdio> #include "BinaryTree.h" // 方法1 int Tree
阅读全文
摘要:// 面试题55(一):二叉树的深度 // 题目:输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的 // 结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 #include <cstdio> #include "BinaryTree.h" int TreeDepth(
阅读全文
摘要:// 面试题54:二叉搜索树的第k个结点 // 题目:给定一棵二叉搜索树,请找出其中的第k大的结点。 #include <cstdio> #include "BinaryTree.h" const BinaryTreeNode* KthNodeCore(const BinaryTreeNode* p
阅读全文
摘要:// 面试题53(三):数组中数值和下标相等的元素 // 题目:假设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编程实 // 现一个函数找出数组中任意一个数值等于其下标的元素。例如,在数组{-3, -1, // 1, 3, 5}中,数字3和它的下标相等。 #include <cstdio>
阅读全文
摘要:// 面试题53(二):0到n-1中缺失的数字 // 题目:一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字 // 都在范围0到n-1之内。在范围0到n-1的n个数字中有且只有一个数字不在该数组 // 中,请找出这个数字。 #include <cstdio> int GetMiss
阅读全文
摘要:// 面试题53(一):数字在排序数组中出现的次数 // 题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1, 2, 3, 3, // 3, 3, 4, 5}和数字3,由于3在这个数组中出现了4次,因此输出4。 #include <cstdio> int GetFirstK(const
阅读全文
摘要:// 面试题52:两个链表的第一个公共结点 // 题目:输入两个链表,找出它们的第一个公共结点。 #include <cstdio> #include "List.h" unsigned int GetListLength(ListNode* pHead); ListNode* FindFirstC
阅读全文
摘要:// 面试题51:数组中的逆序对 // 题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组 // 成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 #include <cstdio> int InversePairsCore(int* data, int* copy,
阅读全文
摘要:// 面试题50(二):字符流中第一个只出现一次的字符 // 题目:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从 // 字符流中只读出前两个字符"go"时,第一个只出现一次的字符是'g'。当从该字 // 符流中读出前六个字符"google"时,第一个只出现一次的字符是'l'。 #
阅读全文
摘要:// 面试题50(一):字符串中第一个只出现一次的字符 // 题目:在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出 // 'b'。 #include <cstdio> #include <string> char FirstNotRepeatingChar(const c
阅读全文
摘要:// 面试题49:丑数 // 题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。求按从小到 // 大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7。 // 习惯上我们把1当做第一个丑数。 #include <cstdio> // 算法1的代码 //
阅读全文
摘要:// 面试题48:最长不含重复字符的子字符串 // 题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子 // 字符串的长度。假设字符串中只包含从'a'到'z'的字符。 #include <string> #include <iostream> // 方法一:蛮力法 bool ha
阅读全文
摘要:// 面试题47:礼物的最大价值 // 题目:在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值 // (价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向左或 // 者向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计 // 算你最多能拿到多少价值的礼物?
阅读全文
摘要:// 面试题46:把数字翻译成字符串 // 题目:给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成"a",1翻 // 译成"b",……,11翻译成"l",……,25翻译成"z"。一个数字可能有多个翻译。例 // 如12258有5种不同的翻译,它们分别是"bccfi"、"bwfi"、"bczi
阅读全文
摘要:// 面试题45:把数组排成最小的数 // 题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼 // 接出的所有数字中最小的一个。例如输入数组{3, 32, 321},则打印出这3个数 // 字能排成的最小数字321323。 #include "cstdio" #include
阅读全文
摘要:// 面试题44:数字序列中某一位的数字 // 题目:数字以0123456789101112131415…的格式序列化到一个字符序列中。在这 // 个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一 // 个函数求任意位对应的数字。 #include <iostream>
阅读全文
摘要:// 面试题43:从1到n整数中1出现的次数 // 题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如 // 输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。 #include <cstdio> #include <cstring> #i
阅读全文
摘要:// 面试题42:连续子数组的最大和 // 题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整 // 数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 #include <cstdio> bool g_InvalidInput = false; int Fi
阅读全文
摘要:// 面试题41:数据流中的中位数 // 题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么 // 中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值, // 那么中位数就是所有数值排序之后中间两个数的平均值。 #include <cstdio> #inclu
阅读全文
摘要:// 面试题40:最小的k个数 // 题目:输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8 // 这8个数字,则最小的4个数字是1、2、3、4。 #include <cstdio> #include "Array.h" #include <set> #include <v
阅读全文
摘要:// 面试题39:数组中出现次数超过一半的数字 // 题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例 // 如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中 // 出现了5次,超过数组长度的一半,因此输出2。 #include
阅读全文
摘要:// 面试题38:字符串的排列 // 题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc, // 则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。 #include <cstdio> void Permutation(char*
阅读全文

浙公网安备 33010602011771号