剑指Offer
学习带师
这个作者很懒,什么都没留下…
展开
-
求n以内的所有质数,并且各位数字之和是偶数
import java.util.*;public class Untitled { public static void main(String[] args) { int num=100; process1(num); process2(num); //int num=234; //int g=(num/1)%10;//个位 //System.out.println(g); //int s=(num/10)%10;//十位 //System.out.print.原创 2020-05-12 10:02:32 · 906 阅读 · 0 评论 -
剑指Offer之翻转单词
题目:Input:"I am a student."Output:"student. a am I"这道题用辅助结构很简单,现在要求空间复杂度为O(1),具体的思路是先局部翻转,再整体翻转。局部翻转的关键是使用一个指针j来找空格的位置,找到后就翻转之前的单词。重复此过程,然后是整体翻转。public String ReverseSentence(String str) {...原创 2020-05-06 22:48:38 · 159 阅读 · 0 评论 -
剑指Offer之和为S的二个数字
题目:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的思路:利用二个指针,一个指向数组头部left,一个指向数组尾部right,left往后走,right往前走,对left和right位置上的数求和sum如果sum>target;right--如果sum<target;left++pu...原创 2020-05-06 12:31:49 · 141 阅读 · 0 评论 -
万能二分模板
int binary_search(int[] nums, int target) { int left = 0, right = nums.length - 1; while(left <= right) { int mid = left + (right - left) / 2; if (nums[mid] < target) {...转载 2020-05-05 22:43:31 · 416 阅读 · 0 评论 -
剑指Offer之最长不含重复字符的字符串
用HashSet来维持一个窗口,即可,图示参考:https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/solution/tu-jie-hua-dong-chuang-kou-shuang-zhi-zhen-shi-xia/public int lengthOfLon...原创 2020-05-05 15:16:27 · 106 阅读 · 0 评论 -
剑指Offer之数字翻译成字符串
思路:将数字翻译成字符串的时候,可以选一个,也可以选二个public int translateNum(int num) { String s = num + ""; int[] dp = new int[s.length() + 2]; dp[0] = 1; dp[1] = 1; for (int i = ...原创 2020-05-05 10:13:24 · 87 阅读 · 0 评论 -
剑指Offer之调整数组顺序使奇数位于偶数前面
思路一:先统计出奇数的个数,就可以知道奇数位置在数组里面哪里结束,然后复制原数组,得到新数组,遍历新数组,先往原数组(这里很关键)里面的书替代成奇数,再将奇数后面的替换成偶数,时间复杂度为O(n),空间复杂度为O(n)public void reOrderArray(int [] array) { int countJishu=0; for(int num:a...原创 2020-05-03 15:31:26 · 114 阅读 · 0 评论 -
剑指Offer之删除链表中重复的元素
思路:没有就遍历找,有就跳过他public ListNode deleteDuplication(ListNode pHead) { if (pHead == null || pHead.next == null) return pHead; ListNode next = pHead.next; if (pHead.val == next.val) ...原创 2020-05-03 10:28:13 · 89 阅读 · 0 评论 -
剑指Offer之队列实现栈,栈实现队列,数组实现栈,队列
一:栈实现队列,先一次性存入第一个栈,再一次性存储到另外一个栈,弹出即可class MyQueue { /** Initialize your data structure here. */ private Stack<Integer> in; private Stack<Integer> out; public MyQueue() ...原创 2020-05-02 09:39:18 · 126 阅读 · 0 评论 -
剑指Offer之字符串全排列
题目:输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素输入:s = "abc"输出:["abc","acb","bac","bca","cab","cba"]class Solution { StringBuilder sb=new StringBuilder(); StringBuilder sb2=ne...原创 2020-04-29 00:02:51 · 106 阅读 · 0 评论 -
剑指Offer之之字型打印二叉树
之字型打印是指:当前行是从左到右,下一行是从右到左遍历思路:根据节点所在行数进行分别遍历,准备二个栈,s1,s2,首先将头节点加入s1中,然后进行循环,如果s1或s2不为空的话,对节点所在行数的奇偶来分别收集如果是奇数,只要栈s1不为空,弹出一个节点用一个临时链表接收,然后如果弹出节点的左子节点不为空,右子节点不为空,放入栈s2,其中用一个变量layer,通过自增来模拟实现奇偶行,la...原创 2019-12-08 11:39:27 · 79 阅读 · 0 评论 -
剑指Offer之按层打印(一次打印一行)
思路:用一个队列存储二叉树的节点,二个链表,一个链表存储每一层节点,另外一个链表存储所有层的节点首先讲二叉树头节点放入队列中,计算当前队列的长度,然后根据队列的长度,循环将弹出的节点放入存储每一层节点的链表中,之后判断如果弹出节点的左节点不为空,将此左节点加入队列中,如果弹出节点的右子节点不为空,将其加入队列中,队列长度减一。最后将存储每一层节点的链表放入存储所有层的链表中p...原创 2019-12-08 11:22:05 · 113 阅读 · 0 评论 -
剑指Offer之最长回文子串
题目:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设s 的最大长度为 1000。示例 1:输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。示例 2:输入: "cbbd"输出: "bb"这道题有多火,看他的点赞人数就知道了,思路一:暴力解,将所有的字串都列举出来,找出其中最长的回文串即可,//判断是否是回文串 p...原创 2019-12-05 11:06:03 · 317 阅读 · 0 评论 -
剑指Offer之二进制中1的个数
思路:利用位运算n&(n-1),这样算的结果是每一次都会将低位的数二进制表示中的1变成0,在数的二进制表示中统计n&(n-1)运算了几次即可。public int NumberOf1(int n) { if(n==0){ return 0; } int count=0; while(n...原创 2019-12-04 09:47:40 · 61 阅读 · 0 评论 -
剑指Offer之滑动窗口的最大值
题目:给定一个数组 nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 思路:遍历数组,用一个双端队列来存储数组中元素的下标,用L...原创 2019-12-03 19:50:00 · 67 阅读 · 0 评论 -
LeetCode415字符串相加(大数相加),大数相乘
题目:给定两个字符串形式的非负整数num1 和num2,计算它们的和。注意:num1 和num2的长度都小于 5100.num1 和num2 都只包含数字0-9.num1 和num2 都不包含任何前导零。你不能使用任何內建 BigInteger 库,也不能直接将输入的字符串转换为整数形式。思路:可以通过手工来模拟加法的过程,参考https://leetcode...原创 2019-11-30 09:50:04 · 346 阅读 · 0 评论 -
剑指Offer之三数之和
题目:给定一个包含 n 个整数的数组nums,判断nums中是否存在三个元素 a,b,c ,使得a + b + c = 0 ?找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[ [-1, 0, 1], [-1, -1, 2]]思路:参考...原创 2019-11-28 09:47:42 · 134 阅读 · 0 评论 -
剑指Offer之数组中任意数累加得到目标值
给定一个数组arr,和一个整数aim,如果可以任意选择arr中的数字,判断能不能累加得到aim,参考了https://blog.csdn.net/pcwl1206/article/details/89476568递归版本:public static isSum(int arr[],int i,int sum,int aim){ if(i==arr.length){ ...原创 2019-11-27 09:08:44 · 899 阅读 · 1 评论 -
剑指Offer之最大累加连续子序列,乘积最大的连续子数组
给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释:连续子数组[4,-1,2,1] 的和最大,为6。进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解动态规划解法:存储以i为结尾的最大子序列和,当dp[i-1]...原创 2019-11-23 11:14:13 · 135 阅读 · 0 评论 -
剑指Offer之TOPK问题
问题一:求出数组中最小的k个数参考博文:https://blog.csdn.net/pcwl1206/article/details/86425013思路一:维护一个k的大根堆即可public static List<Integer> process(int arr[], int k) { ArrayList<Integer> list = new Arr...转载 2019-11-21 22:47:23 · 176 阅读 · 0 评论 -
剑指Offer之字符串转数字
思路:我们以系统最小来进行转换,如果用系统最大来转换,那么对于-2147483647则无法获取首先是检验字符串是否符合要求:1.0开头为纯字母,或+号加字母(A,+AB.....) 1.1开头是减号,且数组长度为1,或者第二个字符为 0,即 -, -0 1.2 001,002 第二位字符还有就是进行转换过程进行溢出判断public class Stri...原创 2019-11-20 10:27:38 · 97 阅读 · 0 评论 -
剑指Offer之二叉搜索树转成双向链表和数组转为二叉搜索树
思路:二叉树的一般问题都可以利用递归思想来做,本题也不例外。我们可以将此题看成二个递归子问题,即我们希望左子树递归得到一个节点数组但是只有二个元素,一个代表最左,一个代表最右,右子树也是递归得到二个元素的节点数组,然后我们将左子树得到的数组中最右连接头节点,但需要将头节点的左右都置为空(取头节点),将最右的节点和此时的头节点进行双向连接即可,右子树也是类似的操作,将右子树得到的数组的最左节点与...原创 2019-11-16 10:17:35 · 70 阅读 · 0 评论 -
剑指Offer之丑数问题
1.判断一个数是否是丑数将这个数分别除以2,3,5,取出所有情况public boolean isUgly(int num) { if(num==0){ return false; } while(num!=1){ if(num%2==0){ num=num/2; ...原创 2019-11-13 21:32:50 · 88 阅读 · 0 评论 -
剑指Offer之非递归实现二叉树的前,中,后 序以及层次遍历和序列化,反序列化
先序思路:先将头节点放入栈中,弹出打印,然后判断当前节点的右节点是否为空,不为空,放入栈中,然后再将当前节点的左节点放入栈中,因为放入的顺序是先右再左,利用了栈的特殊性,便实现了二叉树的非递归先序遍历public List<Integer> preorderTraversal(TreeNode root) { List<Integer> list=...原创 2019-11-12 21:00:27 · 133 阅读 · 0 评论 -
剑指Offer之判断一个数是否是回文数
整体思路就是取数字中最高位和最低位来比较,然后再分别向下取数循环此操作,如果其中有一个不相等,返回false否则返回true,下面以一个数字来具体说明4 5 6 5 41.首先先取数字中的最高位,其他位都为0的数help,help是这样算的:int help=1;while(n/hlep>=10){ help*=10;}2.n为给的数,也就是he...原创 2019-11-12 20:24:41 · 89 阅读 · 0 评论 -
剑指Offer之之字行打印矩阵
这道题的关键是将数组的打印分为多个对角线的打印,在对角线的打印是双向的且用一个boolean类型的变量用来控制是从上到下,还是从下到上//答应对角线上的元素,可以从右上到左下,Up为true,从左下到右上,false为左下到右上 //给定一个右上角的点和左下角的点 public static void printLevel(int[][] m, int row1, int col...原创 2019-11-11 22:01:23 · 88 阅读 · 0 评论 -
剑指Offer之转圈打印矩阵
可分为部分打印和整体打印假如有这样的矩阵:3 1 2 45 6 7 89 0 3 1部分打印图示:也就是部分打印的是一个圈,部分打印的步骤是:1.只有一列的时候2.只有一行的时候3.不止一行一列的时候a.从左往右 b.从上往下 c.从右往左 d.从下往上整体打印是将打印完一个圈之后,将左上角的点沿着对角线往下移动一...原创 2019-11-10 11:09:09 · 94 阅读 · 0 评论