剑指offer
lxxxxxt
这个作者很懒,什么都没留下…
展开
-
数组中只出现一次的数
一个只出现一次的数,其他出现两次全部的数异或,最后的数就是要找的数class Solution { public int singleNumber(int[] nums) { int res = nums[0]; for(int i=1;i<nums.length; i++){ res ^= nums[i]; } return res; }}两个只出现一次的数,其他出现两次假设原创 2020-09-18 22:08:38 · 89 阅读 · 0 评论 -
《剑指offer》—— 37 数字在升序数组中出现的次数
题目统计一个数字在升序数组中出现的次数思路二分法找目标数字的最右边界。代码public class Solution { public int GetNumberOfK(int [] nums , int target) { return divide(nums, target) - divide(nums, target-1); } //返回目标值右边一个的下标 public int divide(int[] nums, int target){原创 2020-09-17 21:25:24 · 75 阅读 · 0 评论 -
剑指offer+leetcode需要复习的题
剑指offer4根据前序中序序列重建二叉树(分治,递归)重建二叉树17判断是否是树的子结构(递归)判断是否是树的子结构19顺时针打印矩阵(边界)顺时针打印矩阵21是否是栈的弹出序列先把栈添加成,序列的第一个元素在栈顶的状态,然后弹出,匹配就弹出,不匹配就继续压栈。最后看空不空。是否是栈的弹出序列22从上往下打印二叉树(队列)2从上往下打印二叉树23判断数组是否是二叉搜索树的后序遍历序列(与4类似)找到左右子树分界线,左边的小于根节点,右原创 2020-09-17 12:23:56 · 97 阅读 · 0 评论 -
每天一个小知识
今天也是被自己菜哭的一天while(j<popped.length && stack.peek() == popped[j] && !stack.isEmpty() ){ stack.pop(); j++;}while里的顺序,必须要先判断j和stack的条件,才能执行stack.peek() == poped[j],否则会报EmptyStackException。while(j<popped.length && !s原创 2020-09-15 21:42:59 · 123 阅读 · 0 评论 -
《剑指offer》—— 64 求1+2+...+n
题目求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路利用递归用&&的短路原则代替判断public class Solution { public int Sum_Solution(int n) { //return (n%2==1) ? (n+1)...原创 2020-04-07 18:07:09 · 85 阅读 · 0 评论 -
《剑指offer》—— 60 从上到下按层打印二叉树
题目从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路类似32从上到下打印二叉树,用队列存储二叉树。一个节点出队的同时进数组,然后左右子节点入队。根节点的左右子节点入队后,队列长度=2;记录数组大小,当数组=2时(即左右子节点出队进数组,其左右子节点又进队了,当前队列长度=4),将当前数组作为一行加入结果数组,然后重置队列长度、数组、数组大小。代码package nowcoder;import java.util.ArrayList;import java.uti原创 2020-08-19 19:52:41 · 113 阅读 · 0 评论 -
《剑指offer》—— 55 二叉树深度
题目输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { ...原创 2020-03-20 18:50:16 · 72 阅读 · 0 评论 -
《剑指offer》—— 50 第一个只出现一次的字符
题目在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).思路利用HashMap(存储时不按顺序,找第一个不重复的字符时如果要遍历hashmap可以用LinkedHashMap;或者遍历原字符串)。代码import java.util.*;public class Sol...原创 2020-04-07 18:03:56 · 94 阅读 · 0 评论 -
《剑指offer》—— 49 丑数
题目把只包含质因子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...转载 2020-04-07 16:17:21 · 68 阅读 · 0 评论 -
《剑指offer》—— 48 位运算实现加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路位运算:两个数异或:相当于每一位相加,不考虑进位;两个数相与,并左移一位,相当于求得进位;代码package nowcoder;/* * 48: 不用加减乘除做加法 */public class AddExceptOperator { public static void main(String []args) { int a = 10; int b = 20; Sy原创 2020-08-18 21:57:50 · 164 阅读 · 0 评论 -
《剑指offer》—— 45 把数组排成最小的数
题目输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路把数组转换为字符串,将字符串排序。排序规则:若ab > ba,则 a > b,若ab < ba,则 a < b,若ab = ba,则 a = b;比如 “3” < ...原创 2020-04-06 23:01:13 · 101 阅读 · 0 评论 -
《剑指offer》—— 43 1~n整数中1出现的次数
题目求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。代码public class Sulotion{ public int c...原创 2020-04-06 19:09:21 · 108 阅读 · 0 评论 -
《剑指offer》——42 连续子数组的最大和
题目HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的...原创 2020-04-06 18:06:55 · 83 阅读 · 0 评论 -
《剑指offer》—— 40 最小的K个数
题目输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。解法1快排,一趟快排后看基准元素位置,如果恰好是k-1,则其前面的就是最小的k个数;如果小于k-1,则保留基准元素前面的,继续对后面的快排;如果大于k-1,则基准元素后面的舍弃,对前面的继续快排。时间复杂度O(n);但是会修改原数组。import java....原创 2020-04-01 20:19:14 · 68 阅读 · 0 评论 -
《剑指offer》—— 39 数组中出现次数超过一半的数字
题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路1利用哈希表,记录每个数出现的次数;遍历哈希表,看是否有符合要求的数字。代码1import java.util.HashMap;import java.util....原创 2020-03-23 18:33:39 · 74 阅读 · 0 评论 -
《剑指offer》—— 38 字符串的排列
题目输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。思路利用递归的思想,将第一个字符依次与后面的字符交换,再对每个交换后的序列全排序代码import java.util.ArrayList;import java.util.Collections;pu...原创 2020-04-01 16:55:38 · 93 阅读 · 0 评论 -
华为研发工程师编程题---牛客
题目有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?代码:...原创 2020-03-31 22:26:53 · 207 阅读 · 2 评论 -
《剑指offer》—— 36二叉搜索树与双向链表
题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路递归的转换左右子树,返回转换后的链表的头结点如果左子树不空,则将左子链表的尾结点连在根节点左侧如果右子树不空,则将右子链表连在根节点右侧代码/**public class TreeNode { int val = 0; TreeNode ...原创 2020-03-23 17:34:07 · 46 阅读 · 0 评论 -
《剑指offer》—— 35 复杂链表的复制
题目输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路1利用哈希表,建立原链表和复制链表之间的映射,在复制链表上建立next和random关系,输出复制链表的头结点代码1/*public class Random...原创 2020-03-23 16:57:15 · 51 阅读 · 0 评论 -
《剑指offer》—— 33 二叉树的后序遍历序列
题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路二叉搜索树的后序遍历中,最后一个节点是根节点,比根节点大的是右子树,比根节点小的是左子树首先找到左右子树分界线,然后递归的判断左右子树是否符合后序遍历代码public class Solution { public boole...原创 2020-03-22 20:58:05 · 79 阅读 · 0 评论 -
《剑指offer》—— 32从上到下打印二叉树
题目从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路借助队列打印根节点(1)时,左右子节点(2,3)入队;然后队头是下一个根节点(2),打印后出队,其左右子(4,5)再入队;(现在队头是3,打印3,左右子入队。。。)代码import java.util.ArrayList;import java.util.Queue;import java.util.Linked...原创 2020-03-22 17:58:49 · 108 阅读 · 0 评论 -
《剑指offer》—— 31 栈的压入、弹出序列
题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路建立辅助栈检查popA当前元素是否在辅助栈的栈顶,如果不在,则按pushA的...原创 2020-03-22 17:28:48 · 88 阅读 · 0 评论 -
《剑指offer》—— 30 包含min函数的栈
题目定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数,在该栈中,调用push()、pop()、min()的时间复杂度应为O(1)思路借助辅助栈,每次压栈时,把这次比较(新元素和当前的最小元素)的最小元素压入辅助栈(重复的也要压入,保证弹出时可以两个栈同时弹出栈顶元素而不影响当前最小元素)代码...原创 2020-03-21 21:58:29 · 51 阅读 · 0 评论 -
《剑指offer》—— 29 顺时针打印矩阵
题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵:1 2 3 45 6 7 89 10 11 1213 14 15 16则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.思路第一种:从左上角开始一圈圈的打印注意边界条件的判定(举例子计算边界)第二种:先打印...原创 2020-03-21 22:59:10 · 56 阅读 · 0 评论 -
《剑指offer》—— 27 二叉树镜像
题目操作给定的二叉树,将其变换为源二叉树的镜像。/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/publ...原创 2020-03-20 18:52:00 · 45 阅读 · 0 评论 -
《剑指offer》—— 26 树的子结构
题目输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)图片来自 https://www.cnblogs.com/lfeng1205/p/6826026.html思路分两步,1,首先遍历A的根节点,找到与B的根节点相等的节点;2,然后从根节点分别比较左右子树每一步一个递归:1,递归的遍历A的左右子树,与B的根节点比较;2,找到相同的根节点后,...原创 2020-03-21 21:30:39 · 70 阅读 · 0 评论 -
《剑指offer》—— 25 合并排序链表
题目输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution {...原创 2020-03-20 18:48:40 · 49 阅读 · 0 评论 -
《剑指offer》—— 24 反转链表
题目输入一个链表,反转链表后,输出新链表的表头。代码/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/import java.util.Stack;public class Solutio...原创 2020-03-21 20:56:35 · 83 阅读 · 0 评论 -
《剑指offer》—— 22链表中倒数k个结点
题目输入一个链表,输出该链表中倒数第k个结点。/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/import java.util.List;import java.util.ArrayLis...原创 2020-03-20 18:40:12 · 48 阅读 · 0 评论 -
《剑指offer》—— 21 调整数组顺序使奇数位于偶数前面
题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,(并保证奇数和奇数,偶数和偶数之间的相对位置不变。)代码import java.util.ArrayList;import java.util.List;public class Solution { public void reOrderArray(i...原创 2020-04-07 18:36:30 · 61 阅读 · 0 评论 -
《剑指offer》—— 16 数的整数次方
题目给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0思路考虑幂的取值情况快速幂算法:代码public class Solution { public double Power(double base, int exponent) { //return...原创 2020-03-20 18:56:31 · 55 阅读 · 0 评论 -
《剑指offer》—— 12 矩阵中的路径
题目请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,右,上,下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如下面所示的矩阵中包含一条字符串”bfce”的路径,但是矩阵中不包含”abcb”路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这...原创 2020-03-12 22:02:14 · 52 阅读 · 0 评论 -
《剑指offer》—— 11 旋转数组的最小数字
题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为 {1, 2, 3, 4, 5} 的一个旋转,该数组的最小值为1。思路旋转之后的数组实际上可以划分为两个排序的子数组,而且前面的子数组的元素都是大于或者等于后面子数组的元素。最小的元素刚好是这两个子数组的分界线。采用...原创 2020-03-12 21:13:27 · 63 阅读 · 0 评论 -
《剑指offer》—— 10 斐波那契数列
题目:求斐波那契数列的第n项。解法一:递归,效率低public class Fibonacci{ public long fibonacci(int n) { if(n <= 0){ return 0; } if(n == 1){ return 1; } return fibonacci(n-1)+fibonacci(n-2); }}递...原创 2020-03-08 22:49:38 · 107 阅读 · 0 评论 -
《剑指offer》—— 9 用两个栈实现队列
题目用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deletedHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。思路队列是先进先出的结构,栈是先进后出的结构。添加元素时放入Stack1。删除时要删除的元素在栈底,所以全部弹出到Stack2,此时要删除的元素在Stack2的栈顶,可以删除。再添加新的元素时依然放入Stack1。即:如果S...原创 2020-03-11 21:15:17 · 61 阅读 · 0 评论 -
《剑指offer》—— 8 二叉树的下一个节点
题目给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左、右子节点的指针,还有一个指向父节点的指针。思路如果这个节点有右子树,那么它的下一个节点就是它的右子树的最左子节点。如果这个节点没有右子树:当这个节点是它父节点(判断父节点是否空)的左子节点,那么它的下一个节点就是它的父节点。当这个节点是它父节点的右子节点,就沿着它的父节点一直...原创 2020-03-08 22:32:05 · 82 阅读 · 0 评论 -
《剑指offer》—— 7 重建二叉树
题目输入某二叉树的前序遍历和中序遍历的结果,请重新构造出该二叉树。假设输入的前序遍历和中序遍历的结果中不包含重复的数字。例如输入的前序遍历序列为{1,2,4,7,3,5,6,8}和中序遍历为{4, 7, 2, 1, 5, 3, 6, 8},则重建出二叉树并输出它的头结点。思路前序遍历(前根遍历)中,遍历的第一个节点是根节点;中序遍历中,根节点在中间,且左边是左子树,右边是...原创 2020-03-08 21:53:54 · 66 阅读 · 0 评论 -
《剑指offer》—— 6从尾到头打印链表
题目输入一个链表的头结点,从尾到头反过来打印出每个节点的值。是否可以改变链表结构?当我们打算修改数据时,最好先询问是否可以修改。思路1,用栈:从头到尾遍历链表,将读入的数据入栈;然后从栈顶输出。2,递归:因为递归本质上就是一个栈结构。每访问一个节点时,先递归输出它后面的节点。(当链表非常长时,会导致函数调用层级很深,有可能导致函数调用栈溢出)解法一:用栈实现class Lis...原创 2020-03-07 22:30:12 · 60 阅读 · 0 评论 -
《剑指offer》—— 5 替换空格
题目请实现一个函数,把字符串中的每个空格替换成 “%20”。 例如输入 “We are happy.”,则输出”We%20are%20happy.”。知识点C/C++中的字符串都以‘/0’结尾C/C++把常量字符串放到单独的内存区域,当几个指针赋值给相同的常量字符串时,它们实际上指向相同内存地址(java中也是把常量放到常量池);不同的字符数组则会开辟不同的空间。C#中String...原创 2020-03-07 21:44:25 · 68 阅读 · 0 评论 -
《剑指offer》—— 4 二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路将二维数组看作矩阵,从右上角开始查找(row = 0,col = column.length - 1);如果比右上角的数字小,则排除这一列,col - 1;如果比右上角的数字大,则排除这一行,row + 1...原创 2020-03-07 21:02:48 · 80 阅读 · 0 评论