剑指offer
文章平均质量分 98
剑指offer
拓荒探险者
这个作者很懒,什么都没留下…
展开
-
《剑指offer》所有面试题的笔记总结
*建议:还是以书为主,然后以我的笔记为辅助。C#不太了解,所以没放书上的代码。博文https://www.cnblogs.com/james111/p/7003100.html对这个问题分析得很全面。思路很简单,每个元素的值就是ta应该所处的数组下标,然后不断地归位就可以了。我的笔记如下:这个题目相比上一个题目,难在“不能修改数组”上。所以思路是这样的:以题目中的数组为例,长度为8,范围是1~7。从中间将其范围划分成两组:1~4一组,5~7一组。然后对值为1~4和值为5~7的数字进行计原创 2020-12-28 18:02:43 · 520 阅读 · 0 评论 -
面试题44:数字序列中某一位的数字
思路:规律如下表:数字的区间范围范围内所有数字的总位数0~91 * 1010~992 * 901000~9993 * 90010000~99994 * 9000……规律很明显,剩下的就是编程细节。计算公式在草稿上。草稿如下:代码实现及验证:#include <iostream>using namespace std;int function(int target) { target += 1; int i原创 2020-12-28 17:47:56 · 101 阅读 · 1 评论 -
面试题60:n个骰子的点数(补充解释)
前言: 书上的解释太简单了,在此补充解释下。思路: 利用动态规划,不断地迭代即可。动态规划的公式为:dp[i][j] = dp[i-1][j-1] + dp[i-1][j-2]+dp[i-1][j-3]+dp[i-1][j-4]+dp[i-1][j-5]+dp[i-1][j-6]。例:假设有5个骰子,具体计算如下。实际上只需要两行的空间(2个长度为30的数组)交替运算就可以,这便是书中的算法。代码实现:#include <iostream>#include <assert.原创 2020-12-06 22:41:10 · 168 阅读 · 0 评论 -
面试题43:1~n整数中1出现的次数(自己实现)
前言:剑指offer第43题,书上讲解没看明白,故自己进行了研究。思路如下:1、求出dp数组的值。dp[i]表示0到10^i-1内所有数字中“1”出现的次数。归纳一下便可发现规律:dp[0] = 0dp[1] = 10 * dp[0] + 1dp[2] = 10 * dp[1] + 10dp[3] = 10 * dp[2] + 100dp[4] = 10 * dp[3] + 1000dp[5] = 10 * dp[4] + 10000dp[6] = 10 * dp[5] + 100000原创 2020-12-05 20:24:52 · 121 阅读 · 0 评论 -
面试题19:正则表达式匹配(通俗易懂版代码)
把剑指offer上的代码全部展开,然后重写了一下并详细解释,感觉这样更好理解一些。代码实现如下:#include <iostream>#include <assert.h>using namespace std;bool matchCore(char *str, char *pattern);bool match(char* str, char* pattern) { if (str == nullptr || pattern == nullptr) return原创 2020-12-04 17:42:55 · 117 阅读 · 0 评论 -
面试题31:栈的压入、弹出序列
思路:按照入栈的顺序将push数组入栈,直到遇到与pop数组相同的元素,然后将其从push数组中弹出。重复这个过程。#include <iostream>#include <vector>#include <stack>using namespace std;// 注意:默认两个数组的长度是相等的。bool f(const int* push, c...原创 2020-03-26 16:52:06 · 113 阅读 · 0 评论 -
面试题29:顺时针打印数组
思路:将整个问题划分成多个子问题,打印数组的每一圈都是一个子问题。#include <iostream>#include <vector>using namespace std;// 注意:参数类型不要用unsigned int,因为在本程序中用到了0减1,而0减1后会溢出。void printMatClockwisely(int(*numbers)[4], i...原创 2020-03-26 15:52:56 · 141 阅读 · 0 评论 -
面试题63:股票的最大利润
思路:如果扫描到数组中的第i个数字时,只要我们能记住之前的i-1个数字中的最小值,就能算出在当前价位卖出时可能得到的最大利润。#include <iostream>using namespace std;int main(){#define N 8 int a[N] = {9,11,8,5,7,12,16,14}; // 数组长度必须大于等于2 int mi...原创 2020-03-23 21:39:03 · 123 阅读 · 0 评论 -
面试题60:n个骰子的点数
思路:利用动态规划,把所有子问题写出来,然后逐个求解。首先从最简单的情况开始:1个骰子的情况,2个骰子的情况,3个骰子的情况,…以此类推。如果用手算的话,前三种情况足够让你发现其中的规律。#include <iostream>using namespace std;int main(){#define MAX_SUM 10000#define MAX_N 10 ...原创 2020-03-23 15:52:56 · 158 阅读 · 0 评论 -
面试题48:最长不含重复字符的字符串
#include <iostream>using namespace std;int main(){ int char_hash[26] = { 0 }; for (int i = 0; i < 26; i++) { char_hash[i] = -1; } int max = 0; int head = ...原创 2020-03-22 20:58:42 · 92 阅读 · 0 评论 -
面试题47:礼物的最大价值
#include <iostream>using namespace std;int main(){#define N 4#define M 4 int a[N+1][M+1] = { {0,0,0,0,0}, {0,1,10,3,8}, {0,12,2,9,6}, {0,5,7,4,11}, {0,3,7,16,5} ...原创 2020-03-22 20:07:31 · 145 阅读 · 0 评论 -
面试题17:打印从1到最大的n位数
我自己的实现,常规思路#include<iostream>#include <assert.h>using namespace std;bool increment_str(char *num_str, int str_len) { // return false表示超过了num_str所表示的最大范围。 // 应该检查num_str是否全是数字,这里暂时...原创 2020-01-06 18:27:04 · 92 阅读 · 0 评论 -
面试题16:数值的整数次方
#include<iostream>#include <assert.h>using namespace std;bool equal(double d1, double d2) { return abs(d1 - d2) < 0.000001; // double精度设置}double Power(double base, int exponent)...原创 2020-01-05 23:28:10 · 78 阅读 · 0 评论 -
数字序列中某一位的数字
#include <iostream>using namespace std;int digitAtIndex(int );int countOfIntegers(int );int digitAtIndex(int, int);int beginNumber(int);int digitAtIndex(int index) { if (index < 0) {...原创 2019-11-20 19:51:45 · 93 阅读 · 0 评论 -
1~n整数中1出现的次数【不懂】
#include <iostream>using namespace std;int NumberOf1Between1AndN(int n);int NumberOf1(const char* strN);int PowerBase10(unsigned int n);int NumberOf1Between1AndN(int n) { if (n <= 0)...原创 2019-11-20 19:50:26 · 86 阅读 · 0 评论 -
15 二进制中1的个数
·思想:尽量不要动原数据,负数位移时就会带上符号位,容易出问题。新建一个flag用于移动比较。#include <iostream>using namespace std;int NumberOf1(int n) { int count = 0; unsigned int flag = 1; while (flag) { if (n & flag) { ...原创 2019-11-20 19:38:32 · 101 阅读 · 0 评论 -
14 剪绳子
·注意:至少要切一刀。·特点:从长度4往后,一定是切割比不切割要大。#include <iostream>#include <vector>#include <algorithm>using namespace std;int maxProductAfterCutting_solution1(int length) { if (length &l...原创 2019-11-20 19:37:29 · 78 阅读 · 0 评论 -
13 机器人的运动范围
#include <iostream>using namespace std;int getDigitSum(int number) { int sum = 0; while (number > 0) { sum += number % 10; number /= 10; } return sum;}bool check(int threshol...原创 2019-11-20 19:36:32 · 115 阅读 · 0 评论 -
12 矩阵中的路径
#include <iostream>using namespace std;void printMap(bool *visited, int rows, int cols) { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { cout << visited[...原创 2019-11-20 19:35:59 · 109 阅读 · 0 评论 -
11 旋转数组的最小数字
·二分法搜索方法:#include <iostream>using namespace std;int Min(int * numbers, int length) { if (numbers == NULL || length <= 0) { throw new std::exception("Invalid parameters"); } int ind...原创 2019-11-20 19:33:32 · 123 阅读 · 0 评论 -
快速排序
#include "stdafx.h"#include <iostream>using namespace std;int RandomInRange(int start, int end) { if (start >= end) { throw new std::exception("error"); } return rand() % (end - st...原创 2019-11-20 19:30:06 · 79 阅读 · 0 评论 -
10 斐波那契数列
·效率对比:递归与非递归。差距很大。#include <iostream>using namespace std;long long Fibonacci(unsigned int n) { if (n <= 0) { return 0; } if (n == 1) { return 1; } return Fibonacci(n-1) + Fib...原创 2019-11-20 19:29:30 · 255 阅读 · 0 评论 -
9 用两个栈实现队列
#include <iostream>#include <stack>using namespace std;template<typename T> class CQueue {public: CQueue(void) {}; ~CQueue(void) {}; void appendTail(const T& node); T...原创 2019-11-20 19:27:43 · 85 阅读 · 0 评论 -
8 二叉树的下一个节点
·理解关键:先序遍历的意思是先遍历左子树,等到左子树全部遍历完之后才遍历自己,然后是右子树。#include <iostream>using namespace std;struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; BinaryTreeN...原创 2019-11-20 19:26:43 · 106 阅读 · 0 评论 -
7 重建二叉树
·注意:前序序列和中序序列中都不能有重复的数字。#include "stdafx.h"#include <iostream>using namespace std;struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};BinaryTreeN...原创 2019-11-20 19:25:58 · 115 阅读 · 0 评论 -
6 从尾到头打印链表
·思想:本质上栈和递归实际上是同一个东西。栈能实现的,递归也能实现;递归能实现的,栈也能实现。但是小心递归导致栈溢出。// ConsoleApplication1.cpp : Defines the entry point for the console application.//#include <iostream>#include <stack>using...原创 2019-11-20 19:25:27 · 93 阅读 · 0 评论 -
5 替换空格
·思想:倒着copy// ConsoleApplication1.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <iostream>using namespace std;// length是数组string的最大容量,字符串实际长度并不知道...原创 2019-11-20 19:24:35 · 89 阅读 · 0 评论 -
字符串不同初始化方式区别
#include <iostream>using namespace std;int main() { char str1[] = "hello world"; char str2[] = "hello world"; char *str3 = "hello world"; char *str4 = "hello world"; if (str1 == str2) ...原创 2019-11-20 19:23:44 · 146 阅读 · 0 评论 -
4 二维数组中的查找
#include <iostream>using namespace std;// 从右上角开始bool Find(const int* matrix, const int &rows, const int &columns, const int &number) { bool found = false; if (matrix != NULL &...原创 2019-11-20 19:20:31 · 118 阅读 · 0 评论 -
3 数组中重复的数字
#include <iostream>using namespace std;bool duplicate(int numbers[], int length, int* duplication) { //检查前两变量 if (numbers == NULL || length <= 0) { return false; } //检查每一个元素 for (i...原创 2019-11-20 19:18:25 · 161 阅读 · 0 评论 -
1 赋值运算符函数
·思想:利用临时对象,进行指针交换(所指内存空间的交换),间接进行赋值,防止new出现异常覆盖掉原数据。/*******************************************************************Copyright(c) 2016, Harry HeAll rights reserved.Distributed under the BSD li...原创 2019-11-20 19:13:07 · 84 阅读 · 0 评论