剑指offer
intimexy
这个作者很懒,什么都没留下…
展开
-
机器人的运动范围
题目描述:地上有一个 m 行和 n 列的方格。一个机器人从坐标 0,0 的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于 k 的格子。请问该机器人能够达到多少个格子?思路:利用递归实现,每次只能走上下左右四个点,进行判断点的位置是否越界,点数之和是否大于 K,是否已经走过了。 public int movingCount(int m, int n, int k) { int[][] arr = new int[m][n]; int num =m原创 2020-12-09 13:41:02 · 48 阅读 · 0 评论 -
矩阵中的路径
题目描述:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。思路:回溯法,双层 for 循环,判断每一个点,每次递归调用上下左右四个点,用flag 标志是否已经匹配(return),进行判断点的位置是否越界,是否正确匹配,判断矩阵的路径与模式串的第index个字符是否匹配。 public boolean exist(char[原创 2020-12-09 13:39:59 · 217 阅读 · 0 评论 -
滑动窗口的最大值
题目描述:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值思路:两个 for 循环,第一个 for 循环滑动窗口,第二个 for 循环滑动窗口中的值,寻找最大值。 public int[] maxSlidingWindow(int[] nums, int k) { if(nums == null || nums.length == 0){ return new int[0]; } int[] arr = new int[原创 2020-12-09 13:37:36 · 103 阅读 · 0 评论 -
求二叉搜索树的第K小的节点
题目描述:给定一棵二叉搜索树,请找出其中的第 k 小的结点思路:中序遍历保存二叉树节点,加上get方法public class Offer63 { ArrayList<TreeNode> list = new ArrayList<>(); public TreeNode KthNode(TreeNode root, int k) { zhong(root); return list.get(k - 1); } public void zhong(TreeNode原创 2020-12-09 13:35:55 · 216 阅读 · 0 评论 -
对称的二叉树
题目描述:请实现一个函数,用来判断一颗二叉树是不是对称的。注意:如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:利用递归进行判断,若左子树的左孩子等于右子树的右孩子且左子树的右孩子等于右子树的左孩子,并且左右子树节点的值相等,则是对称的。 public boolean isSymmetrical(TreeNode root){ if(root == null) { return false; } return is(root,root); } public bool原创 2020-12-09 13:30:13 · 85 阅读 · 0 评论 -
删除链表中重复的节点
题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。思路:先新建一个头节点,然后向后查找值相同的节点,重复查找后删除。 public Node deleteDuplication(Node head) { if(head == null) { return null; } Node outnode = null; Node innode = null; Node prenode = null; for(outnode原创 2020-12-09 13:28:33 · 124 阅读 · 0 评论 -
链表中环的入口节点
题目描述:一个链表中包含环,请找出该链表的环的入口结点。思路:定义快慢两个指针,相遇后(环中相汇点)将快指针指向 pHead 然后一起走,每次往后挪一位,相遇的节点即为所求。详细分析:相遇即 p1=p2 时,p2所经过节点数为 2x,p1 所经过节点数为 x,设环中有 n 个节点,p2 比 p1 多走一圈有2x=n+x; n=x;可以看出 p1 实际走了一个环的步数,再让 p2 指向链表头部,p1 位置不变,p1,p2 每次走一步直到 p1==p2; 此时 p1 指向环的入口。 public char原创 2020-12-09 13:25:25 · 93 阅读 · 0 评论 -
字符流中第一个不重复的字符
题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。思路:借助辅助空间进行判断,如字符数组。 public char firstUniqChar(String s) { if(s == null || s.length() == 0 || s.trim().length() == 0) { return (Character) null; } char[] ch = s.toCharArray(); Map<Character,Integer> map =原创 2020-12-08 14:31:20 · 81 阅读 · 0 评论 -
表示数值的字符串
题目描述:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)思路:逐个字符进行判断,e 或 E 和小数点最多出现一次,而 e 或 E 的前一个必须是数字,且不能是第一个或最后一个字符,符号的前一个字符不能是 e 或 E。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、“±5”、"-1E-16"及"12e+5.4"都不是。 public boolean isNumber(String s) {原创 2020-12-08 14:30:06 · 140 阅读 · 0 评论 -
构建乘积数组
题目描述:给定一个数组 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]。其中 A[i] = 1。不能使用除法,思路:使用矩阵法求解,将矩阵分为上三角矩阵和下三角矩阵,分别求乘积 public int[] constructArr(int[] a) { if(a.length == 0){ return new int[0]; }原创 2020-12-08 14:27:37 · 74 阅读 · 0 评论 -
找出重复的数
题目描述:在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内,找出数组中任意一个重复的数字思路:先排序,然后判断相邻两个元素是否相同 public int findDuplicate(int[] numbers) { if(numbers == null || numbers.length == 0) { return -1; } Arrays.sort(numbers); for(int i = 0; i < numbers.length - 1;i++)原创 2020-12-08 14:25:33 · 155 阅读 · 0 评论 -
树中两个节点的最低公共祖先
题目描述:给定一个二叉搜索树,输入两个节点,求树中两个节点的最低公共祖先思路:从根节点开始遍历树,如果节点 p 和 q 都在右子树上,那么以右孩子为根节点递归,如果节点 p 和节点 q 都在左子树上,那么以左孩子为根节点递归,否则就意味找到节 p 和节点 q 的最低公共祖先了。 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(root == null) { return null;原创 2020-12-08 14:23:14 · 196 阅读 · 0 评论 -
字符串转化为整数
题目描述:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。1 直接使用库函数(但是题目不让) public static void main(String[] args) { StringBuilder sb = new StringBuilder(); sb.append(9); int n = Integer.valueOf(sb.toString()); }2 不用库函数第一个判断是数字或者±;然后循环判断是否是数字,append后看long超过没有;加个判断原创 2020-12-08 14:21:45 · 241 阅读 · 0 评论 -
不用加减乘除做加法
题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/,四则运算符号。思路:利用位运算//(和 s)==(非进位和 n)++(进位 c )。即可将 s = a + b 转化为:s=a+b⇒s=n+c//非进位和用异或^,进位和用于&//循环求 n和 c ,直至进位 c = 0;此时 s = n,返回 n 即可。public class Offer47 { public int Add(int num1,int num2) { while(num2 != 0) {原创 2020-12-08 14:17:13 · 53 阅读 · 0 评论 -
求1到n的和
题目描述:求 1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case 等关键字及条件判断语句 public int Sum_Solution(int n) { if(n == 1) { return 1; }else { return n + Sum_Solution(n - 1); } } public static void main(String[] args) { int num = new Offer46().Sum_S原创 2020-12-08 14:13:16 · 1348 阅读 · 0 评论 -
圆圈中最后剩下的数字(约瑟夫环)
题目描述:圆圈中最后剩下的数字(约瑟夫环)思路:利用公式法:f[n] = (f[n-1] + k) mod n,或使用循环链表实现//0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。//例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,//则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。//解析删除的值为k,m有可能比n大,所以要(m - 1)% n,那么删除的数就是k=(m-1原创 2020-12-08 14:11:41 · 285 阅读 · 0 评论 -
扑克牌顺子
题目描述:从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这 5 张牌是不是连续的。2~10 为数字本身,A 为 1,J 为 11,Q 为 12,K 为 13,大小王可以看成任意数字。思路:用数组记录五张扑克牌,将数组调整为有序的,若 0 出现的次数>=顺子的差值,即为顺子。 public static boolean isContinuous(int [] numbers) { if(numbers == null || numbers.length == 0) { return f原创 2020-12-08 13:50:28 · 75 阅读 · 0 评论 -
字符串中字符的移动
1 反转字符串题目描述:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变 public void reverseSentence(String str) { if(str == null || str.length() == 0 || str.trim().length() == 0) { return; } String str1 = str.trim(); String[] str2 = str1.split(" "); for(int i = str2.l原创 2020-12-07 18:36:38 · 1520 阅读 · 0 评论 -
和为n的连续整数序列
题目描述:输出所有和为n的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序public void threeSum(int[] nums,int n) { if(nums == null || nums.length == 0){ return; } Arrays.sort(nums); for(int i = 0;i < nums.length;i++) { if(nums[i] >= n) { return; } i原创 2020-12-07 18:27:11 · 198 阅读 · 0 评论 -
剑指Offer-找出只出现一次的数字
题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路:两个相同的数异或后为 0,一个数和 0 异或还是它本身,将所有数异或后即得到 A、B 异或的结果,排序后异或import java.util.Arrays;//就是异或选择出唯一不重复的数字 ^public class Offer { public static void main(String[] args) { int[] arr = {1,2,3,1,3,4}; num(ar原创 2020-11-23 19:10:50 · 93 阅读 · 0 评论 -
剑指Offer- 二叉树的深度
题目描述:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路:利用递归遍历分别返回左右子树深度 public int maxDepth(TreeNode root) { if(root == null) { return 0; } int max = Integer.MIN_VALUE; if(root.left == null && root.right == null) { retu原创 2020-11-23 18:44:42 · 72 阅读 · 0 评论 -
剑指Offer-求某个数在数组中出现次数
题目描述:统计一个数字在排序数组中出现的次数。思路:利用二分查找+递归思想,进行寻找。当目标值与中间值相等时进行判断 public static int getNumberOfK(int[] arraySorted, int k) { if(arraySorted == null || arraySorted.length == 0) { return 0; } Arrays.sort(arraySorted); int count = 0; for(int i = 0;i &原创 2020-11-23 18:41:37 · 174 阅读 · 0 评论 -
剑指Offer-两个链表的第一个公共节点
题目描述:输入两个链表,找出它们的第一个公共结点。思路:先求出链表长度,然后长的链表先走多出的几步,然后两个链表同时向下走去寻找相同的节点,代码量少的方法需要将两个链表遍历两次,然后从头开始相同的节点。 public Node FindFirstCommonNode(Node head1, Node head2) { if(head1 == null || head2 == null) { return null; } int i = 0; int j = 0; Node no原创 2020-11-15 18:29:53 · 69 阅读 · 0 评论 -
剑指Offer-数组中逆序对的个数
题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P思路:两个for循环搞定(就是时间复杂度高点) public int InversePairs(int [] array) { if(array == null || array.length == 0) { return 0; } int count = 0; for(int i = 0; i< array.length;i++) {原创 2020-11-15 18:28:02 · 82 阅读 · 0 评论 -
剑指Offer-第一个出现一次的字符
题目描述:在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置思路:利用HashMap 保存字符和出现次数。 public char firstUniqChar(String s) { if(s == null || s.length() == 0) { return ' '; } char[] ch = s.toCharArray(); Map<Character,Integer> map = new原创 2020-11-15 18:25:25 · 56 阅读 · 0 评论 -
剑指Offer-求第N个丑数
题目描述:求从小到大的第 N 个丑数。丑数是只包含因子 2、3 和 5 的数,习惯上我们把 1 当做是第一个丑数。思路:乘2或3或5,之后比较取最小值。 public static int getUglyNumber(int n) { if(n <= 0) { return 0; } int[] arr = new int[n]; arr[0] = 1; int min = 0; int cheng2 = 0; int cheng3 = 0; int chen原创 2020-11-13 19:02:49 · 55 阅读 · 0 评论 -
剑指Offer-把数组中的数排成一个最小的数
题目描述:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个思路:把正整数数组进行排序,然后创建一个StringBuilder字符串从小到大接收数组里面的正整数,等到最小数字的字符串。 public String PrintMinNumber(int [] numbers) { if(numbers == null || numbers.length == 0) { return null; } StringBuilder sb = new St原创 2020-11-08 17:15:29 · 111 阅读 · 0 评论 -
剑指Offer-从1到非负整数n中1出现的次数
题目描述:输入一个整数 n,求从 1 到整数 n 的十进制表示中 1 出现的次数思路:若百位上数字为 0,百位上可能出现 1 的次数由更高位决定;若百位上数字为百位上可能出现 1 的次数不仅受更高位。 public static int NumberOf1Between1AndN2(int n) { if(n < 0) { return 0; } int i = 0; int count = 0; int high = 0; int cur = 0; int low =原创 2020-11-08 17:10:10 · 115 阅读 · 0 评论 -
剑指Offer-连续子数组的最大和
题目描述:输入一个整型数组,数组中有正数也有负数,数组中一个或连续的多个整数组成一个子数组,求连续子数组的最大和思路:(1)一个for循环遍历数组,一个for循环累加从当前位加到最后可以得到的最大数值。(2)若和小于 0,则将最大和置为当前值,否则计算最大和。//思路(1) public int maxSubArray(int[] nums) { if(nums == null || nums.length == 0) { return -1; } int max = Integ原创 2020-11-06 19:39:01 · 50 阅读 · 0 评论 -
剑指Offer-输入 n 个整数,找出其中最小的 K 个数
思路:排序然后再取出就好了 public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k){ if(input.length == 0 || k < 0 || input.length < k) { return null; } ArrayList<Integer> list = new ArrayList<>(); Arrays.sort(input);原创 2020-11-06 19:31:01 · 91 阅读 · 0 评论 -
剑指offer-数组中出现次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。如果不存在则输出 0。思路:将首次出现的数 count+1,与之后的数进行比较,相等则+1,否则—1,最后进行校验是否超过长度的一半。 public static int moreThanHalfNum(int[] nums) { if(nums == null || nums.length == 0) { return -1; } int count = 0; int max = Integer.MIN_VA原创 2020-11-04 18:41:49 · 40 阅读 · 0 评论 -
剑指offer-二叉树中和为某值的路径
题目描述:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路:先保存根节点,然后分别递归在左右子树中找目标值,若找到即到达叶子节点,打印路径中的值。 public boolean hasPathSum(TreeNode root, int sum) { if(root == null) { return false; } sum -= root.data; if(root.le原创 2020-11-04 18:27:31 · 76 阅读 · 0 评论 -
剑指offer-后序遍历二叉搜索树
题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出 Yes,否则输出 No。假设输入的数组的任意两个数字都互不相同。思路:先找到右子树的开始位置,然后分别进行左右子树递归处理//后序遍历二叉搜索树 /*输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出 Yes,否则输出 No。假设输入的数组的任意两个数字都互不相同。*/public class Offer24 { TreeNode root; public boolean Ver原创 2020-11-03 20:48:07 · 720 阅读 · 0 评论 -
剑指Offer-层序遍历二叉树
题目描述:从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路:利用队列辅助实现。 public void PrintFromTopToBottom(TreeNode root) { if(root == null) { System.out.println("null"); } Queue<TreeNode> queue = new <TreeNode> LinkedList(); queue.offer(root); while(!queue.原创 2020-11-02 19:15:44 · 86 阅读 · 0 评论 -
剑指Offer-判断一个栈是否是另一个栈的弹出序列
题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如列 1,2,3,4,5是某栈的压入顺序,序列 4,5,3,2,1 是该压栈序列对应的一个弹出序列,但4,3,5,1,2 就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路:用栈来压入弹出元素,相等则出栈 public boolean IsPopOrder(int [] push,int [] pop) { if(push.length != pop.le原创 2020-11-02 19:10:59 · 188 阅读 · 0 评论 -
剑指Offer-包含min函数的栈
题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的 min函数。思路:定义两个栈,一个存放入的值。另一个存最小值。public class Offer{ Stack<Integer> stack1 = new Stack<Integer> ();//存放入的值 Stack<Integer> stack2 = new Stack<Integer> ();//存最小值 public void push(int data) { sta原创 2020-10-25 18:24:24 · 65 阅读 · 0 评论 -
剑指Offer-顺时针打印矩阵
题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下 4X4 矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字 1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.思路:按层模拟:终止行号大于起始行号,终止列号大于起始列号 public void spiralOrder(int[][] matrix) { if(matrix.length == 0) { System.out原创 2020-10-24 19:37:22 · 80 阅读 · 0 评论 -
剑指offer-二叉树的镜像
题目描述:操作给定的二叉树,将其变换为源二叉树的镜像。思路:使用递归或非递归方式交换每个节点的左右子树位置。代码实现: 递归,间复杂度:O(n),空间复杂度:O(n) public TreeNode isSymmetric(TreeNode root) { if(root == null) { return null; } TreeNode temp = root.left; root.left = isSymmetric(root.right); root.right原创 2020-10-23 18:27:51 · 46 阅读 · 0 评论 -
剑指offer-判断二叉树A中是否包含子树B
题目描述:输入两棵二叉树 A,B,判断 B 是不是 A 的子结构。(ps:我们约定空树不是任意一个树的子结构)思路:若根节点相等,利用递归比较他们的子树是否相等,若根节点不相等,则利用递归分别在左右子树中查找。 public boolean hasSubTree(TreeNode source, TreeNode target) { if(source == null && target == null) { return false; } if(xiangdeng(s原创 2020-10-23 18:25:02 · 290 阅读 · 0 评论 -
剑指offer- 合并两个有序链表
题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路:傻瓜式操作,只进行值的交换。 public Node mergeTwoLists(Node head1, Node head2) { if(head1 == null) { return head2; } if(head2 == null) { return head1; } if(head1 == null && head2 == null) {原创 2020-10-22 13:42:02 · 83 阅读 · 0 评论