剑指offer
oldGarlic
看看世界有多大!!!
展开
-
56:第一个只出现一次的字符
第一个只出现一次的字符字符串中第一个只出现一次的字符在字符串中找出第一个只出现一次的字符,如输入"abaccdeff",输出’b’public class Offer56 { public static void main(String[] args) { new Offer56().firstNotRepeatingChar("abaccdeff"); } // 思路:我们只需要寻找一个数据结构来保存单个字符的次数,如数组,map public void fir原创 2020-08-21 21:39:39 · 88 阅读 · 0 评论 -
55:丑数
丑数:因子只包含2,3,5的数,1为第一个丑数,2,3,5皆为丑数,请第1500个丑数。public class Offer55 { public static void main(String[] args) { System.out.println(new Offer55().getUglyNumber_solution(5)); } public int getUglyNumber_solution(int index){ if(index原创 2020-08-20 21:00:20 · 71 阅读 · 0 评论 -
54:最长不含重复字符的子字符串
最长不含重复字符的子字符串public class Offer54 { public static void main(String[] args) { System.out.println(new Offer54().LongestSubStringWithoutDuplication("asfahjfabswr")); } public int LongestSubStringWithoutDuplication(String str) {原创 2020-08-19 21:41:47 · 129 阅读 · 0 评论 -
53:礼物的最大价值
礼物的最大价值在一个m*n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值你可以从棋盘的左上角开始拿格子里的礼物,每一次向右或者向下一格,直到右下角public class Offer53 { public static void main(String[] args) { int[][] arr = { {1,10,3,8}, {12,2,9,6}, {5,7,4,11},原创 2020-08-18 23:30:42 · 92 阅读 · 0 评论 -
52:把数字翻译成字符串
把数字翻译成字符串给定一个数字,我们按照如下规则把它翻译为字符串,0翻译成"a",1翻译成"b",…11翻译成"l",25翻译成"z"。例如12258有5中不同的翻译,分别是""bccfi,“bwfi”,…public class Offer52 { public int getTranslationCount(int number) { if(number<0) return 0; //转字符 String sNu原创 2020-08-17 21:53:08 · 96 阅读 · 0 评论 -
51:把数组排成最小的数
把数组排成最小的数public class Offer51 { //思路:进行一个类似冒泡排序的方法来排序即可 public String PrintMinNumber(int [] numbers) { if(numbers==null || numbers.length<=0) return ""; ArrayList<String> list = new ArrayList<String>();原创 2020-08-16 21:09:49 · 103 阅读 · 0 评论 -
50:数学序列中某个的数字
数学序列中某个的数字数字以0123456789101112131415161718…的格式序列化到一个字符序列中。在这个序列中,第5位是5,第13位是1,第19位是4。实现一个函数,求任意第n位对应的数字。public class Offer50 { public static void main(String[] args) { int digit = new Offer50().digitAtIndex(13); System.out.println(di原创 2020-08-13 21:26:29 · 132 阅读 · 0 评论 -
49:1~n整数中1出现的次数
1~n整数中1出现的次数输入一个整数n,求1~n这n整数的十进制表示中1出现的次数。主要还是一个找规律的题目。解题思路传送门public class Offer49 { public static void main(String[] args) { int i = new Offer49().numberOf1Between1AndN(21354); System.out.println(i); } public int numberOf1原创 2020-08-12 22:14:58 · 86 阅读 · 0 评论 -
48:连续子数组的最大和
连续子数组的最大和输入一个整形数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)public class Offer48 { public static void main(String[] args) { int[] arr = {1,-2,3,10,-4,7,2,-5}; System.out.println(new Offer48().findGreatestSumOfSubArray(arr)原创 2020-08-11 22:14:05 · 89 阅读 · 0 评论 -
47:数据流中的中位数
数据流中的中位数public class Offer47 { //默认最小堆实现 PriorityQueue<Integer> maxHeap = new PriorityQueue<>(); //实现最大堆需要重写Comparator PriorityQueue<Integer> minHeap = new PriorityQueue<>(10, new Comparator<Integer>() {原创 2020-08-10 20:35:14 · 93 阅读 · 0 评论 -
46:最小的第K个数
最小的第K个数public class Offer46 { //基于快速排序的基础partition()方法 public void getLeastNumbers(int[] input,int[] output,int k){ if(input==null||input.length==0||output==null||k<0)return ; int start = 0; int end = input.length-1;原创 2020-08-09 13:48:23 · 71 阅读 · 0 评论 -
45:数组中出现次数超过一半的数字
数组中出现次数超过一半的数字数组中有一个数字出现的次数超过数组长度的一半public class Offer45 { public static void main(String[] args) { int[] data = {1,4,3,2,4,2,5,4,2}; System.out.println(new Offer45().moreThanHalfNum(data)); } //思路:数字出现的次数超过数组的一半,我们如果把该数字的次数和剩余数组的次原创 2020-08-08 19:53:47 · 76 阅读 · 0 评论 -
44:字符串的排序
字符串的排序输入一个字符串,打印出该字符串中字符的所有排序public class Offer44 { public static void main(String[] args) { String str = "abc"; char[] arr = str.toCharArray(); permutation(arr, 0); } public static void permutation(char[] arr, int begin)原创 2020-08-07 22:54:30 · 78 阅读 · 0 评论 -
43:序列化二叉树
序列化二叉树请实现两个函数,分别用来序列化和反序列化二叉树序列化:把二叉树转换为字符串 反序列化:把字符串转换为二叉树public class Offer43 { public static void main(String[] args) { TreeNode node = Main.createNode(); String serialize = new Offer43().Serialize(node); System.out.println原创 2020-08-06 21:51:50 · 89 阅读 · 0 评论 -
42:二叉搜索树与双向链表
二叉搜索树与双向链表输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表public class Offer42 { //Java没有内存指针的概念,所以用了个静态变量 public static TreeNode last = null; public static void main(String[] args) { TreeNode node = Main.createNode(); TreeNode convert = Conve原创 2020-08-05 23:09:43 · 67 阅读 · 0 评论 -
41:复制复杂链表
复制复杂链表实现函数ComplexListNode(ListNode node)复制一个链表public class Offer41 { public static void main(String[] args) { ComplexListNode node1 = new ComplexListNode(1); ComplexListNode node2 = new ComplexListNode(2); ComplexListNode node3 =原创 2020-08-04 21:23:14 · 74 阅读 · 0 评论 -
40:二叉树中和为某一值的路径
二叉树中和为某一值的路径输入一颗二叉树和一个整数,打印出二叉树节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径public class Offer40 { public static void main(String[] args) { TreeNode node = Main.createNode(); new Offer40().FindPath(node, 7); } public ArrayList<原创 2020-08-03 22:42:11 · 88 阅读 · 0 评论 -
39:二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列输入一个整数数组,判断该数组是不是某个二叉搜索树后序遍历结果?public class Offer39 { public static void main(String[] args) { int[] data = {5,7,6,9,11,10,8}; boolean test = test(data, 0, data.length); System.out.println(test); } public原创 2020-08-02 14:12:46 · 78 阅读 · 0 评论 -
38:之字型打印二叉树
之字型打印二叉树二叉树层次遍历的变种,我们可以使用两个栈来保存待打印数据即可public class Offer38 { public static void main(String[] args) { TreeNode node = Main.createNode(); cengci(node); } public static void cengci(TreeNode root){ if (root==null)return原创 2020-08-01 15:10:48 · 93 阅读 · 0 评论 -
37:从上到下打印二叉树
从上到下打印二叉树二叉树的层次遍历的变种,使用两个变量记录待打印的数据个数和下次待打印的数据个数即可。public class Offer37 { public static void cengci2(TreeNode root){ if(root==null)return; LinkedList<TreeNode> queue = new LinkedList<>(); queue.add(root);原创 2020-07-31 22:14:47 · 110 阅读 · 0 评论 -
36:从上到下打印二叉树
从上到下打印二叉树这个题目也就是二叉树的层次遍历,使用队列来做public class Offer37 { public static void cengci(TreeNode root){ if(root==null)return; LinkedList<TreeNode> queue = new LinkedList<>(); queue.add(root); while (!queue.isEmpty()){原创 2020-07-31 21:55:19 · 71 阅读 · 0 评论 -
35:包含min函数的栈
包含min函数的栈定义栈的结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min,push及pop的时间复杂度都是O(1)主要问题点: 再把最小值弹出之后,我们如何知道下一个最小值,所以才需要用到额外的辅助栈。public class Offer36 { Stack<Integer> stack1 = new Stack<>(); Stack<Integer> stack2 = new Stack<>();原创 2020-07-30 21:10:12 · 80 阅读 · 0 评论 -
34:顺时针打印矩阵
顺时针打印矩阵输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。public class Offer35 { public static void main(String[] args) { int[][] data = {{1,2,3,4}, {1,2,3,4}, {1,2,3,4}}; printMatrixInCircle(data); }原创 2020-07-29 23:38:25 · 107 阅读 · 0 评论 -
33:对称的二叉树
对称的二叉树请实现一个函数,用来判断一颗二叉树是不是堆成。public class Offer34 { //思路:递归来做,一次同时比较左右两个对称的点位 public static boolean isSymmetrical(TreeNode root1,TreeNode root2){ if(root1==null && root2==null)return true; if(root1==null||root2==null)retu原创 2020-07-28 22:41:24 · 60 阅读 · 0 评论 -
32:二叉树的镜像
二叉树的镜像完成一个函数,输入一颗二叉树,输出它的镜像public class Offer33 { public static void main(String[] args) { TreeNode node = Offer10.createNode(); mirrorRecursively(node); Main.cengci(node); } //思路:将某节点下的两个节点互换即可 public static void原创 2020-07-27 22:22:59 · 70 阅读 · 0 评论 -
31:树的子结构
树的子结构输入两个二叉树A和B,判断B是不是A的子结构public class Offer32 { //思路:1.在A树中找到与B树根相同的节点。2.比较后续的树结构是否相同 public static boolean hasSubTree2(TreeNode tree1,TreeNode tree2){ boolean result = false; if(tree2==null||tree1==null)return false; //原创 2020-07-26 21:54:16 · 63 阅读 · 0 评论 -
30:合并两个排序的链表
合并两个排序的链表输入两个递增排序的链表,合并这两个链表并使新链表找那个的节点依然是递增排序的public class Offer31 { public static void main(String[] args) { LNode node1 = new LNode(1); LNode node2 = new LNode(3); LNode node3 = new LNode(5); LNode node4 = new LNode(7);原创 2020-07-25 23:39:19 · 68 阅读 · 0 评论 -
29:反转链表
反转链表定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头节点public class Offer30 { public static void main(String[] args) { LNode node1 = new LNode(1); LNode node2 = new LNode(2); LNode node3 = new LNode(3); LNode node4 = new LNode(4);原创 2020-07-24 22:19:27 · 67 阅读 · 0 评论 -
28:链表中环的入口节点
链表中环的入口节点如果一个链表中包含环,如何找出环的入口节点?public class Offer29 { public static void main(String[] args) { LNode node1 = new LNode(1); LNode node2 = new LNode(2); LNode node3 = new LNode(3); LNode node4 = new LNode(4); LNode nod原创 2020-07-23 22:42:33 · 87 阅读 · 0 评论 -
27:链表中倒数第K个节点
链表中倒数第K个节点输入一个链表,输出该链表中倒数第K个节点public class Offer28 { //思路,定义两个节点变量first,next,first先指向头节点,走k-1步,这时候next节点指向头结点,first节点走到尾节点 //链表不能为空,k>0,k<=链表的长度 public static LNode FindKthToTail(LNode node, int k){ if(node==null||k==0)return nu原创 2020-07-22 22:53:28 · 69 阅读 · 0 评论 -
26:调整数组顺序使奇数位于偶数前面
调整数组顺序使奇数位于偶数前面输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分public class Offer27 { public static void main(String[] args) { int[] arr = {1,4,2,8,3,5}; ReorderOddEvent(arr); for (int i : arr) { System.out.原创 2020-07-21 21:44:09 · 68 阅读 · 0 评论 -
25:表示数值的字符串
表示数值的字符串设计一个函数用来判断字符串是否表示数值(包括整数和小数)字符串+100,5e2,-123,3.1415926,-1E-16都表示数值,但12e,1a3.14,1.2.3,±5,12e+5.4public class Offer26 { public static void main(String[] args) { String s = new String("12e+6.4"); System.out.println(isNumeric(s.toCh原创 2020-07-20 21:13:33 · 120 阅读 · 0 评论 -
24:正则表达式
正则表达式请设计一个函数用来匹配包含’.‘和’‘的正则表达式,’.‘表示匹配任意字符,’'表示它前面的字符可以任意次数。例如字符串"aaa"与模式a.a和abaca匹配,不与aa.a和ab*a匹配public class Offer25 { public static void main(String[] args) { char[] str = new String("fsffffas").toCharArray(); char[] p1 = new Stri原创 2020-07-19 22:26:18 · 233 阅读 · 0 评论 -
23:删除链表的重复节点
删除链表中重复的节点条件:链表为排序链表public class Offer24 { public static void findDuplicateNodes(LNode node) { if(node==null)return; //定义引用指向next节点 LNode pre = node; LNode next = node.next; //1.如果为单节点,则不会进入循环 while (原创 2020-07-18 23:05:15 · 66 阅读 · 0 评论 -
22: 删除链表的节点
删除链表的节点给定一个单向链表的头指针和节点指针,在O(1)时间内删除该节点public class Offer23 { public static void deleteListNode(LNode head,LNode target){ //1.判断是否为空节点 if(head==null||target==null)return; //2.判断头结点是否指向目标指针,头节点情况 if(head==target){原创 2020-07-17 23:45:00 · 128 阅读 · 0 评论 -
21:打印从1到最大的n位数
打印从1到最大的n位数例如n=3,从1打印到999public class Offer22 { public static void main(String[] args) { printMaxOfN(2); } public static void printMaxOfN(int n){ if(n<1)return; //1.考虑大数的情况,所以使用char[] char[] number = new char[n+原创 2020-07-17 23:17:09 · 77 阅读 · 0 评论 -
20:数值的整次方
数值的整次方实现函数double(double base,int exponent),求base的exponent次方要点:使用exponent>>1来代替exponent/2使用exponent&1来判断奇偶参数合规性判断public class Offer21 { public static double power(double base,int exponent){ double result = 0; if(expone原创 2020-07-16 00:19:31 · 86 阅读 · 0 评论 -
19:二进制中1的个数
二进制中1的个数:输入整数,输出该整数转二进制中1的值public class Offer20 { /** * 这里需要想明白,一个整数减去1会发生什么 * 现在我们假想二进制序列中,第一个1位于最右边,当它减去1后,最右边的1会变成0 * 例子:0011减去1后得到0010 * 如果第一个位于第n个位置,当它减去1后,该位置会从1变为0,并在下一个位置由0变成1 * 例子:1100减去1后会得到1010 * i&(i-1)可原创 2020-07-14 23:19:22 · 121 阅读 · 0 评论 -
18:剪绳子
剪绳子:一根长度为n的绳子,把绳子剪成m段,n>m>1且n>1,每段绳子的长度即为k[0],k[1]…k[m],求k[0]*k[1]…*k[m]的最大乘积.n是一个给定的绳子长度,m为未知动态规划:public class Offer19 { public static void main(String[] args) { System.out.println(maxProduct(7)); } /** * 设置f(n)为绳子长度为n时的原创 2020-07-12 23:35:56 · 83 阅读 · 0 评论 -
17:机器人的运动范围
机器人的运动范围存在m行n列的矩阵,一个机器人从(0,0)开始,可以向上、下、左、右走,但是不能进行行坐标和列坐标的数位之和大于k的格子,例如(23,43)的数位之和为 2+3+4+3=12,求机器人能到达多少格子?public class Offer18 { public static void main(String[] args) { System.out.println(movingCount(4,4,4)); } public static int m原创 2020-07-11 13:16:43 · 117 阅读 · 0 评论