1.1.题目1 剑指 Offer 45. 把数组排成最小的数 1.2.解法 这题看的题解,发现自己思路错了. 这里直接拿大佬的题解来讲吧. 一开始这里就把创一个string的数组来存int数组 String.valueOf将int转为string存进数组. 这里应该排序,题解中用到了lambda表达式,判断条件是x+y是否大于y+x 然后添加金stringbuilder然后转成字符串返回. 1.3.代码 class Solution { public String minNumber(int[]…
1.1.题目1 剑指 Offer 04. 二维数组中的查找 1.2.解法 其实就是暴力解法的升级版,从最后一行开始判断,通过num当前的大小, 如果还是大于目标值则行数-1,若是小于则列数+1 1.3.代码 class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { if(matrix==null || matrix.length==0 ||matrix[0].length==0){ retu…
1.1.题目1 剑指 Offer 07. 重建二叉树 1.2.解法 注释解法. 1.3.代码 class Solution { int[] preorder; HashMap<Integer, Integer> map = new HashMap<>(); // 前序遍历 preorder: 根 -- 左 -- 右 第一个肯定是根节点 // 中序遍历 inorder: 左 -- 根 -- 右 public TreeNode buildTree(int[] preorder, int…
1.1.题目1 剑指 Offer 09. 用两个栈实现队列 1.2.解法 解法如题目所说.定义两个栈.这里假设第一个栈为a,第二个栈为b. 实现两个函数增加尾和删除头. 增加即直接push入第一个栈. 删除函数:通过判断a是否为空进行循环,将已经存入的a的栈顶pop存到b中,以此达到倒置的效果. 再将b的栈顶pop出来即可达到删除. 此时a栈为空,下次判断若b栈为空,则输出-1. 否则则继续通过b栈输出栈顶. 1.3.代码 class CQueue { Deque<Integer> a; De…
1.1.题目1 剑指 Offer 42. 连续子数组的最大和 1.2.解法 得到转移方程后,单次遍历. 当前面的连续子数组的和比较是否大于0,是则加起来, 若小于零,则当前的值就可当子数组的开头. 判断每次的大小则取出最大值. 1.3.代码 class Solution { public int maxSubArray(int[] nums) { int res=nums[0]; for(int i=1;i<nums.length;i++){ nums[i]+=Math.max(nums[i-1…
1.1.题目1 剑指 Offer 64. 求1+2+-+n 1.2.解法 这题看评论区真的绝了,都是人才,各个说话都好听,我看到个还有用异常来结束的就离谱. 这题用了&&当左边为false,右边不执行的原理. 1.3.代码 class Solution { public int sumNums(int n) { boolean flag = n > 1 && (n += sumNums(n - 1)) > 0; return n; } } 2.1.题目2 剑指…
1.1.题目1 剑指 Offer 29. 顺时针打印矩阵 1.2.解法 常规开头,先判断特殊情况,然后创建四个变量存放矩阵四边的长度限制. 创建res数组存放结果. 循坏开始,遍历完一行或者一列,就将该行从矩阵的范围内删除, 最终判断左边是否大于右边,上边是否大于下边来判断循环是否应该结束. 1.3.代码 class Solution { public int[] spiralOrder(int[][] matrix) { if (matrix.length==0) return new int…
1.1.题目1 剑指 Offer 59 - I. 滑动窗口的最大值 1.2.解法 解题思路:(来自作者bigbeats) 相当于维护一个最大队列(队头元素最大,向队尾非严格递减) 在未形成窗口前,先构造完整窗口. 在形成窗口后,移动窗口: 判断即将失去的这个左边界值是否是最大值,如果是需要从最大队列中删除这个最大值. 再让队列尾部开始与即将加入的右边界值做对比,如果队列尾部元素大于或等于这个元素,则将这个元素加入尾部,反之将尾部元素删除. 以上两步操作保证队列的顺序是非严格递减的,即队头存放最大…
1.二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. public class Solution { public boolean Find(int target, int [][] array) { if(array == null||array.length==0) return false; int rowIdx = 0,colIdx = array[0]…
  题目描述:   输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.   解题思路:   首先需要判断几个特殊情况,即判断输入的两个指针是否为空.如果第一个链表为空,则直接返回第二个链表:如果第二个链表为空,则直接返回第一个链表.如果两个链表都是空链表,合并的结果是得到一个空链表.   两个链表都是排序好的,我们只需要从头遍历链表,判断当前指针,哪个链表中的值小,即赋给合并链表指针,剩余的结点仍然是排序的,所以合并的步骤和之前是一样的,所以这是典型的递…
题目描述 统计一个数字在排序数组中出现的次数. 牛客网链接 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…
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析 重点抓住这两个链表都是单挑递增的,因此我们只需要不断地比较他们的头结点就行,明显这是个重复的过程. 可以用递归做,也可以不用递归做,不用递归做只需要用两个指针来一直指向两个链表的“头”结点就行了 代码 /* function ListNode(x){ this.val = x; this.next = null; }*/ function Merge(pHead1, pHead2)…
总结 1. Leetcode 上有一道题, 求某一个数字在有序数组中出现的最左位置和最右位置, 而这道题就是那题的变形…
题目: 输入一个链表.输出该链表中倒数第k哥结点.  为了符合大多数人的习惯,本题从1開始计数.即链表的尾结点是倒数第1个结点. 比如一个链表有6个结点.从头结点開始它们的值依次是1.2.3,4,5,6.这个链表的倒数第3个结点是值为4的结点 为了得到第K个结点,非常自然的想法是先走到链表的尾端.再从尾端回溯K步. 但是我们从链表结点的定义可疑看出本题中的链表 是单向链表,单向链表的结点仅仅有从前往后的指针而没有从后往前的指针,因此这样的思路行不通. 既然不能从尾节点開始遍历这个链表.我们还是把…
题目:在一个长度为n的数组里的全部数字都在0到n-1的范围内. 数组中某些数字是反复的,但不知道有几个数字反复了.也不知道每一个数字反复的次数.请找出数组中随意一个反复的数字. 比如假设输入长度为7的数组{2,3,1,0,2,5,3},那么相应的输出是反复的数字2或者3. 解决问题的一个简单的方法是先把输入的数组排序.从排序的数组中找出反复的数字是件easy的事情,仅仅须要从头到尾扫描排序后的数组就能够了.排序一个长度为n的数组须要时间为O(nlogn)时间. 还能够利用哈希表来解决问题.从头到…
题目:实现函数double Power(double base,int exponent),求base的exponent次方.不得使用库函数,同一时候不须要考虑大数问题 1.自以为非常easy的解法: 因为不须要考虑大数问题.这道题看起来非常easy.可能不少应聘者在看到题目30秒后就能写出例如以下的代码: public double powerWithExponent(double base,int exponent){ double result = 1.0; for(int i = 1;i…
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 比如输入一个长度为9的数组{1,2,3,2.2,2.5,4,2}.因为数字2在数组中出现5次,超过数组长度的一半,因此输出2. 解法一:基于Partition函数的O(n)算法: 我们的算法是受高速排序的算法的启示.在随机高速排序的算法中.我们先在数组中随机的选择一个数字.然后调数组中数字的顺序,使得比选中的数字小数字排在它的左边.比选中的数字大的数字都排在它的右边.比方这个选中的数字的下标刚好是n/2.那么这个数字就是数组中…
题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建新的结点.仅仅能调整树中结点指针的指向. 比方例如以下图中的二叉搜索树.则输出转换之后的排序双向链表为: 在二叉树中,每一个结点都有两个指向子节点的指针.在双向链表中.每一个结点也有两个指针.他们分别指向前一个结点和后一个结点.因为这两种结点的结构相似,同一时候二叉搜索树也是一种排序的数据结构.因此在理论上有可能实现二叉搜索树和排序的双向链表的转换. 在搜索二叉树中,左子结点的值总是小于父节点的值,右子节点的值总是大于…
版权声明:本文为博主原创文章,未经博主允许不得转载. 题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构). 解题思路: 首先看牛客网给出的测试用例: 一般对于树的操作不像链表一样,操作更复杂,如果使用循环遍历的话,对于非完全二叉树规律难寻,一般通用的方法就是使用递归求解,本题也不例外,同样使用递归求解,求解的大体思路是首先判断B的根节点和A的根节点是否相同(这里的相同是指节点的值相同并且左右子节点相同),如果相同比较他们的左右子节点,这一步骤是…
题目:输入一棵二叉树的根节点,求该数的深度. 从根节点到叶结点依次进过的结点(含根,叶结点)形成树的一条路径,最长路径的长度为树的深度. 比如.例如以下图的二叉树的深度为4.由于它从根节点到叶结点的最长的路径包括4个结点(从根结点1開始,经过2和结点5,终于到达叶结点7) watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Ce…
题目链接 https://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a?tpId=13&tqId=11172&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题意 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6…
题目描述: 统计一个数字在排序数组中出现的次数. 分析: 二分变形.二分查找最左边和最右边k的位置,然后相减加一就是结果. 代码: class Solution { public: int GetNumberOfK(vector<int> data, int k) { int dataSize = data.size(); ) ; , dataSize - ); ) ; // k不存在 , dataSize - ); ; } int GetPositionOfFirstK(vector<…
面试16题: 题目:数值的整数次方 题:实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 解题思路:主题考虑底数为0.0,指数为负数的情况,此时可以利用全局变量指出g_InvalidInput为True,同时返回0.0 解题代码: # -*- coding:utf-8 -*- class Solution: g_InvalidInput = False def Power(self,…
题目:输入一个正整数数组.把数组里面全部的数字拼接排成一个数,打印能拼接出的全部数字中的一个.比如输入数组{3,32.321}.则打印出这3个数字能排成的最小数字321323. 这个题目最直接的做法应该是先求出这个数组中的全部数字的全排列,然后把每一个排列拼接起来,最后求出排列起来的数字的最小值. 求数组的排列和面试题28很相似.依据排列组合的仅仅是,n个数字总共同拥有n!排列,我们再来看一下更快的算法. 这道题事实上希望我们可以找到一个排序规则,数组依据这个规则排序之后能排成一个最小的数字.要…
题目:请实现一个函数,输入一个整数.输出该数二进制表示中1的个数. 比如把9表示成二进制是1001,有2位是1.因此假设输入9.该函数输出2. 1.可能引起死循环的解法 这是一道非常主要的考察二进制和位运算的面试题. 题目不是非常难.面试官提出问题之后,我们非常快形成一个主要的思路:先推断证书二进制表示中最右边一位是不是1.接着把输入的证书右移一位,此时原来处于从右边树起的第二位被移到最后一位,再推断是不是1.这样没移动一位,知道整个整数变成0为止.如今的问题变成怎么推断一个整数的最右边是不是1…
题目描述 统计一个数字在排序数组中出现的次数.   题解: 使用二分法找到数k然后向前找到第一个k,向后找到最后一个k,即可知道有几个k了 但一旦n个数都是k时,这个方法跟从头遍历没区别,都是O(N)的复杂度 可以再次利用二分法,在第一次找到k的左半部分使用二分法找到不再出现k的位置,其右半部份类似. class Solution01 { public: int GetNumberOfK(vector<int> data, int k) { ); , R = data.size() - , M…
重点 查找算法着重掌握:顺序查找.二分查找.哈希表查找.二叉排序树查找. 排序算法着重掌握:冒泡排序.插入排序.归并排序.快速排序. 顺序查找 算法说明 顺序查找适合于存储结构为顺序存储或链接存储的线性表. 算法思想 顺序查找也称为线形查找,属于无序查找算法.从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功:若扫描结束仍没有找到关键字等于k的结点,表示查找失败. 算法实现 int sequenceSearch(int a[], int valu…
因为有序 所以用二分法,分别找到第一个k和最后一个k的下标.时间O(logN) class Solution { public: int GetNumberOfK(vector<int> data ,int k) { int num=0; int size=data.size(); if(size>0){ int num1=getfk(data,0,size-1,k); int num2=getsk(data,0,size-1,k); if(num1!=-1 &&num2…
1. 题目 2. 解答 时间复杂度为 \(O(n)\) 的算法,顺序遍历数组,当该数字第一次出现时开始记录次数. class Solution { public: int GetNumberOfK(vector<int> data ,int k) { int n = data.size(); if (n == 0) return 0; int num = 0; for (int i = 0; i < n; i++) { if (data[i] == k) { num = 1; while…
Question 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. Solution abc的全排列是:abc, acb, bac, bca, cba, cab 可以看到字符串可以分为两部分,左边固定一个字符,然后右边的字符串之间交换. 然后再将第一个字符和后面的一个字符交换,保持第一个字…