![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
牛客网剑指offter刷题笔记
主要记录下自己在牛客网上面所做的题目的方法和体会
你从不孤单单单单
加油,干吧嘚
展开
-
2020年8月19日华为笔试
今天做了华为机考题,第一题给定一个二维数组,M行N列顺时针从1开始报数,选出个位数为7,十位数为奇数的数,并按报数顺序输出出来题目大概就是这样,这个题目和剑指offer的29题:顺时针打印矩阵非常相似以下代码把给的例子输入进去结果是正确的,但是给定的输出格式不对,导致0%,好气#include <iostream>using namespace std;void selectpeople(int M,int N);void GoCircle(int **numbers,int m原创 2020-08-19 21:28:31 · 666 阅读 · 1 评论 -
二进制中1的个数
题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1,因此,如果输入9,则该函数输出2.方法1:在该方法中,循环的次数等于整数中二进制的位数int NumberOf1(int n){ int count = 0; int flag = 1; while(flag) { //让n的二进制中的每一位和1相与,结果为1,就证明该位为1 if(n & flag) { count++; } flag = flag原创 2020-06-22 22:33:35 · 62 阅读 · 0 评论 -
剪绳子(动态规划、贪婪算法)
题目描述给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]xk[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。动态规划:求一个问题的最优解(通常是求最大值或者最小值),而且该问题能够分解成若干个子问题,并且子问题之间还有重叠的更小的子问题,就可以考虑用动态规划来解决这个问题。应用动态规划之前要分析能否把大原创 2020-06-19 22:20:26 · 227 阅读 · 0 评论 -
机器人的运动范围
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?class Solution {public: int movingCount(int threshold, int rows, int cols原创 2020-06-18 21:02:01 · 62 阅读 · 0 评论 -
矩阵中的路径
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如a b t gc f c sj d e h矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。思路:这是一个可以使用回溯法的典型例题。首先,在矩阵中任选一个格原创 2020-06-17 09:57:54 · 176 阅读 · 0 评论 -
旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路:旋转数组实际可以看作是两个顺序的数组,比如上面的{3,4,5}和{1,2},在这种情况下,找出最小值实际上就是找出第二个数组的第一个数字这里使用的方法是二分查找,找两个“指针”,a,b分别指向整个数组的第一个数字和原创 2020-06-16 11:30:23 · 72 阅读 · 0 评论 -
用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。栈的结构特点就是后进先出,队列的特点是先进先出就是用两个后进先出的栈来实现一个先进先出的功能这里是使用两个栈stack1和stack2 来进行实现:首先将元素通过压栈放进stack1中,但是我们要实现的是将第一个放进去的元素进行输出,也就是这里要实现的删除,然后通过一个个的出栈将元素再次放到stack2中,这样的话第一个元素即原来stack1的栈底元素,就到了stack2栈的顶部,然后再将它删除就完成了;原创 2020-06-08 22:23:19 · 105 阅读 · 0 评论 -
数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。方法一:类似选择排序的方法,将每一个数和其它的数进行比较,得到重复的数字时间复杂度为O(n^2)bool duplicate(int numbers[], int length, int* duplication) { if(n原创 2020-06-06 16:56:02 · 83 阅读 · 0 评论 -
二叉树的下一个节点
题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。一棵有九个节点的二叉树,树中从父节点指向子节点的指针用实线表示,从子节点指向父节点的指针用虚线表示对于题目中的中序遍历,这里共分为三种情况:一 如果一个节点有右子树,那么它的下一个节点就是它的右子树中的最左子节点。二 如果一个节点没有右子树,分两种情况1.节点是它父节点的左子节点,那么它的下一个节点就是它的父节点。2.如果一个节点是它父节点的右子节点原创 2020-06-04 22:31:09 · 186 阅读 · 0 评论 -
重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。这里使用的思想是递归思想:在二叉树的前序遍历序列中,第一个数字总是数的根节点的值。但在中序遍历序列中,根节点的值在序列的中间,左子树的节点的值位于根节点的值的左边,而右子树的节点的值位于根节点的右边,因此需要遍历中序遍历找到根节点的值。struct Binar转载 2020-06-03 22:22:12 · 81 阅读 · 0 评论 -
斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39这里分为两个办法,一个是利用递归方法,因为F(n)=F(n-1)+F(n-2);好处在于代码简单便捷,但是问题在于递归这个方法会频繁的调用栈,不断地压栈和出栈;用递归的方法计算的时间复杂度是以 n 的指数的方式递增的int Fibonacci(int n) { int fib0=0; int fib1=1; int fib; if(n==0 || n=原创 2020-06-02 09:26:03 · 138 阅读 · 0 评论 -
二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。从右上开始比较,如果这个数大于所要查找数,则列往左移动一格,如果这个数小于所要查找数,则行往下移动一行。bool Find(int target, vector<vector<int> > array) { int rows=array.size();//行数,这里是容器函数原创 2020-06-02 09:05:15 · 105 阅读 · 0 评论 -
替换空格
题目如下:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。主要难点在于:1、每个字符串后面都会有一个‘\0’结束符;2、在将字符串中的空格字符’ '转换成%20之后,字符串中的字符数会增加,并且如果不对空格后面的字符串进行处理,会将后面字符给覆盖掉。方法1:对原数组进行操作,将空格后面的字符进行移动,顺序:从前往后void replaceSpace(char *str,int lengt原创 2020-06-01 22:41:28 · 87 阅读 · 0 评论