算法
Zhou_run
一名默默无闻的码农
展开
-
2021-07-23
将二进制转换为十进制:栈实现/** * @Author RunXin * @Date 2021/7/23 16:21 * @description 将字符串二进制转换为十进制数 */public class Binary2Des { public static void main(String[] args) { String a = "1111101"; binary2DesMethod(a); } public static int原创 2021-07-23 16:58:35 · 194 阅读 · 0 评论 -
双向循环链表:移位输出26位字母
双向循环链表:移位输出26位字母实现用户输入一个数使得26个字母的排列发生变化,例如用户输入3,输出结果:-D E F G H I J K L M N O P Q R S T U V W X Y Z A B C同时支持用户负数输出,例如输入-3,输出结果:-X Y Z A B C D E F G H I J K L M N O P Q R S T U V W算法:/** * @Author RunXin * @Date 2021/7/14 9:28 * @description */原创 2021-07-14 15:19:44 · 385 阅读 · 0 评论 -
循环链表:魔术师发牌问题
循环链表:魔术师发牌问题/** * @Author RunXin * @Date 2021/7/12 9:42 * @description 魔术师现在有13张黑桃扑克,现在要完成下面这个魔术: * 将扑克整理好后,翻开第一张为黑桃1(黑桃A)并放在桌上(牌堆剩余12张), * 然后将剩余牌的第一张放置在牌堆最底部,翻开第二张是黑桃2并放在桌上(牌堆剩余11张), * 再将剩余扑克的第一张,第二张一次放到牌堆底,第三张亮出是黑桃3并放在桌上, * 以此类推,是黑桃几就抽到第几张并亮出,直到所原创 2021-07-12 10:31:39 · 121 阅读 · 0 评论 -
循环链表:约瑟夫问题
循环链表:约瑟夫问题/** * @Author RunXin * @Date 2021/7/9 14:20 * @description 约瑟夫环问题 约瑟夫环问题的起源来自犹太历史学家约瑟夫和他的朋友以及39其余的犹太人,总共41人为了躲避敌人,藏在一个山洞中, * 39个犹太人决定宁愿死也不被敌人抓到,于是决定自杀,所有人排成一个圈,由第一个人开始报数,每当数到3,就自杀。 * 这个游戏接着从自杀的位置开始,还是从1数到3。依次类推,约瑟夫将朋友和自己安排在了16和31的位置,最后顺利逃过了原创 2021-07-09 16:34:39 · 128 阅读 · 0 评论 -
最小的k个数 - Java
最小的k个数 - Java题目描述给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组示例1输入[4,5,1,6,2,7,3,8],4 返回值[1,2,3,4]方法一(排序后,再取前k个值)这个没什么好讲的,肯定不是最优解。import java.util.*;public class Solution { public ArrayList<Inte原创 2021-04-19 19:58:11 · 138 阅读 · 0 评论 -
二叉搜索树与双向链表 - Java
二叉搜索树与双向链表 - Java题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}思路二叉搜索树的中序遍历是有原创 2021-04-19 00:05:21 · 194 阅读 · 0 评论 -
栈的压入、弹出序列 - Java
栈的压入、弹出序列 - Java题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)输入[1,2,3,4,5],[4,3,5,1,2]返回值false思路看到题目思考一下解题思路,哦嚯,实例通过了!自信满满上去提交,结果就只是通过了示原创 2021-04-17 16:53:07 · 88 阅读 · 0 评论 -
反转链表 - Java
反转链表 - Java题目描述输入一个链表,反转链表后,输出新链表的表头。示例1输入{1,2,3}返回值{3,2,1}思路这道题花费了我蛮长时间的,刚开始想用新建一个链表每次转换前后顺序实现,后来发现这种做法忽略了修改的也是原本链表,导致死循环。(当然用栈做这个思路一开始就想到了,不过没必要,因为更优的解法肯定存在)看完题解发现跟我的做法有点相似,不过是使用了两个指针。大家看着图对着代码一下子就懂了,总的来说就是pre往后走,head也往后走。让a->next = nul原创 2021-03-26 20:58:55 · 160 阅读 · 0 评论 -
数值的整数方次 - Java
数值的整数方次 - Java题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0示例1输入2,3返回值8.00000思路:解题方法就是很简单的累乘(数学算法),但是需要注意指数有可能是负数,也有可能是0;实现Implementationpublic class Solution { public double Power(double base, int expone原创 2021-03-25 13:43:41 · 167 阅读 · 0 评论 -
链表中倒数第k个结点 - Java
链表中倒数第k个结点 - Java题目描述输入一个链表,输出该链表中倒数第k个结点。如果该链表长度小于k,请返回空。输入{1,2,3,4,5},1 返回值{5}思路看到这题,脑子就会不由自主想到栈,先把链表全部压入栈,再计数出栈就能解决。相信聪明如在座各位也能想到。需要想的只是还有没有更优解。实现Implementation方法一(栈实现)import java.util.*;public class Solution { /** * 代码中的类名、方法名、参原创 2021-03-25 13:42:19 · 134 阅读 · 0 评论 -
二进制中1的个数 - Java
二进制中1的个数 - Java题目描述输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。输入10返回值2思路:看到这种题,第一时间想到的就是规律个位数中,偶数需要一位1,奇数需要两位1(奇数的二进制最后一位必须是1)十位数中,偶数需要两位1,奇数需要三位1…后面才发现并不是这样,这个规律不行,哦嚯,完蛋,思路全无。看了题解,wcao,还能这样解啊!一个整数只要不为0,二进制就存在1;如果把这个数减1,那么原来整数最右边的1就变成0,而右边的0又会变成原创 2021-03-24 11:40:26 · 193 阅读 · 0 评论 -
矩形覆盖 - Java
矩形覆盖 - Java题目描述我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:输入4返回值5思路:这题实际上跟前道题《跳台阶》一样,本质都是斐波那契数列,不清晰的去看看我这篇:斐波那契数列(Fibonacci) - 这就是算法吗?爱了爱了实现Implementationpublic class Solution { public int JumpFloo原创 2021-03-24 09:51:52 · 71 阅读 · 0 评论 -
跳台阶 - Java
跳台阶 - Java题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。这题本质上就是斐波那契数列。解法一样方法一(递归)public class Solution { public int JumpFloor(int target) { if(target <= 3){ return target; } return JumpFloor(原创 2021-03-23 19:51:40 · 142 阅读 · 0 评论 -
重建二叉树 - Java
重建二叉树 - Java做这题一定要知道二叉树的几种遍历,不懂得可以看我的上一篇博客:一起学习二叉树的几种遍历题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。输入[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]返回值{1,2,5,3,4,6,7}思路:根据题目的要求,输入一个二叉原创 2021-03-23 17:23:17 · 216 阅读 · 0 评论 -
一起学习二叉树的几种遍历
一起学习二叉树的几种遍历深度遍历包含(前序,中序,后序)三种遍历方式,广度遍历就是常说的层次遍历。四种主要的遍历思想:前序遍历:根结点 —> 左子树 —> 右子树【根左右】中序遍历:左子树—> 根结点 —> 右子树【左根右】后序遍历:左子树 —> 右子树 —> 根结点【左右根】层次遍历:只需按层次遍历即可【左右】图片来源:(网图)前序遍历:1 2 4 5 7 8 3 6中序遍历:4 2 7 5 8 1 3 6后序遍历:原创 2021-03-23 15:20:39 · 326 阅读 · 0 评论 -
二叉搜索树的第k个结点 - Java
二叉搜索树的第k个结点 - Java题目描述给定一棵二叉搜索树,请找出其中的第k小的TreeNode结点。输入{5,3,7,2,4,6,8},3返回值{4}说明按结点数值大小顺序第三小结点的值为4 思路首先先了解二叉搜索树的定义,二叉搜索树又称二叉查找树,二叉排序树它是一棵空树,或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)左、右子树也分别为二叉排序树;(原创 2021-03-23 02:52:00 · 348 阅读 · 0 评论 -
数组中重复的数字 - Java
数组中重复的数字 - Java题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任一一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1示例1输入[2,3,1,0,2,5,3]返回值2或3看完题目就知道怎么做的一道题(因为有在LeeCode做过,当时看题解也是惊为天人),但是做出来后总是不过,显示超出范围原创 2021-03-20 23:06:53 · 160 阅读 · 0 评论 -
不用加减乘除做加法 - Java
不用加减乘除做加法 - Java题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。输入1,2返回值31、一位数加法普通加法异或1 + 1 = 01 ^ 1 = 0(错误)1 + 0 = 11 ^ 0 = 1(正确)0 + 1 = 10 ^ 1 = 1(正确)0 + 0 = 00 ^ 0 = 0(正确)可以看到在一位数的运算中,会出现进位丢失的问题。而其他都是正常的。那么怎么解决进位的问题呢?原创 2021-03-17 12:36:43 · 113 阅读 · 0 评论 -
平衡二叉树 - Java
平衡二叉树 - java题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。示例1输入{1,2,3,4,5,6,7}返回值true平衡二叉树的左右子树也是平衡二叉树,那么所谓平衡就是左右子树的高度差不超过1.我们只需要递归每个节点,判断子树平衡(左右子树的高度差不原创 2021-03-17 11:49:21 · 111 阅读 · 0 评论 -
二叉树的深度 - Java
二叉树的深度题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。输入{1,2,3,4,5,#,6,#,#,7}返回值4一看到题目其实我就想到要用递归了,但是一直想怎么也想不出来。真的,打代码最忌空想,其实你开始敲,思路就慢慢出来了。以后真就要改掉这个坏习惯。方法一(递归,代码量很少,最重要的是解决思路)/**public class TreeNode { int val = 0; TreeNo原创 2021-03-17 11:28:44 · 138 阅读 · 0 评论 -
第一个只出现一次的字符 - Java
第一个只出现一次的字符题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)输入"google"返回值4第一时候都会想到暴力解法,全部遍历一遍出现次数。但是复杂度会很高。在自己做了一遍而且思考后,我看完题解其实还不是特别懂,卡在了arr[‘字符’]这块,然后我就去Idea过一遍。然后就是perfect!尽管解不出来,看了题解就没有我琢磨不透的…这就是我女朋友常原创 2021-03-16 15:25:29 · 137 阅读 · 0 评论 -
连续子数组得最大和 - Java
连续子数组得最大和题目描述输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).示例1输入[1,-2,3,10,-4,7,2,-5]返回值18说明输入的数组为{1,-2,3,10,—4,7,2,一5},和最大的子数组为{3,10,一4,7,2},因此输出为该子数组的和 18。 思路有了只要左边得负数大于左边得正数,就从负数右边开始。能懂我意思吧??想想这样一个数组{3,4,-8,10,1,4,3},现原创 2021-03-12 17:09:44 · 200 阅读 · 0 评论 -
数组中出现次数超过一半的数字 - Java
数组中出现次数超过一半的数字题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。输入[1,2,3,2,2,2,5,4,2]返回值2看到代码直觉就是用map做,遍历存放数值和出现次数。没多大困难可以做出来,但是占用内存也很高啊。想点办法优化。方法一(easy,easy。不会吧不会吧,你不会做不出来吧)import java.原创 2021-03-12 16:12:42 · 155 阅读 · 0 评论 -
二叉树镜像 - Java
二叉树镜像 - Java题目描述操作给定的二叉树,将其变换为源二叉树的镜像。比如: 源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5示例1输入{8,6,10,5,7,9,原创 2021-03-11 17:25:09 · 135 阅读 · 0 评论 -
合并两个排序的链表 - Java
合并两个排序的链表 - Java题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。示例1输入{1,3,5},{2,4,6}返回值{1,2,3,4,5,6}其实看了题目不太懂的…看完题解就秒懂了。自己写一次过。/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val;原创 2021-03-11 16:37:12 · 96 阅读 · 0 评论 -
变态跳台阶 - Java
变态跳台阶 - Java一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。输入: 3 返回: 4第一眼没看出来,但是直觉告诉我这用公式能算出来。看了题解醍醐灌顶,这不过是斐波那契数列得变种!!易知 f(n)=f(n-1)+f(n-2)+……f(1)f(n-1)=f(n-2)+……f(1)两式相减得f(n)=2f(n-1)public class Solution { public int jumpFloorII(原创 2021-03-10 21:21:04 · 101 阅读 · 0 评论 -
用两个栈实现队列 -Java实现
用两个栈实现队列还好还好,一次过,击败80%题解(用的是牛客解题思路)1. 分析队列的特性是:“先入先出”,栈的特性是:“先入后出”当我们向模拟的队列插入数 a,b,c 时,假设插入的是 stack1,此时的栈情况为:栈 stack1:{a,b,c}栈 stack2:{}当需要弹出一个数,根据队列的"先进先出"原则,a 先进入,则 a 应该先弹出。但是此时 a 在 stack1 的最下面,将 stack1 中全部元素逐个弹出压入 stack2,现在可以正确的从 stack2 中弹出 a,原创 2021-03-09 16:42:38 · 199 阅读 · 1 评论 -
斐波那契数列(Fibonacci) - 这就是算法吗?爱了爱了
斐波那契数列(Fibonacci)今天开始做牛客的剑指Offie,一看到斐波那契我就想到递归,是它是它就是它,然后我就满怀期待地写下了下面地代码。ok,没问题,一次性过。然而,我滴老天鹅,才击败30%的人。科普:斐波那契数列(Fibonacci sequence),又称黄金分割数列。指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)方法一(普通,我这个彩笔都能一下子想出来的)public class S原创 2021-03-09 15:53:32 · 529 阅读 · 1 评论 -
冒泡排序算法(BubbleSort)
快速排序算法(QuickSort)冒泡排序以其“在排序过程中相邻元素不断交换,一些元素慢慢被换到最后,看起来就像是元素在冒泡一样”而得名,它是最简单的一种排序算法,通常被用来对于计算机程序设计入门算法讲解。Definition该算法的实现分以下几步:每次从头开始依次比较相邻的两个元素如果后面一个元素比前一个要小,说明顺序不对,则将它们交换循环完毕之后再次从头开始扫描,直到某次扫描中没有元素交换,不断地重复以上两个过程,直到全部有序例如有一需要排序的数组为:5,8,6,3,9,2,1,7(从原创 2021-03-08 16:49:25 · 546 阅读 · 0 评论 -
快速排序算法
快速排序算法(QuickSort)最近开始重新学习算法,先从快速排序开始。Definition该算法的实现分以下几步:在排序的数组中选择一个基准数(通常是第一个)将数组中小于基准数的移到基准数左边,大于基准数的移到右边对于基准数左右两边的数组,不断地重复以上两个过程,直到全部有序例如有一需要排序的数组为:23,45,17,11,13,89,72,26,3,17,11,13(从小到大排序):将数组第一个数23赋给temp变量,指针 i 指向数组第一个元素,指针 j 指向数组最后一个元素原创 2021-03-08 14:38:17 · 211 阅读 · 3 评论 -
ArrayList<Integer>中数字范围为[0, 1024],请筛选出出现次数为奇数的数字,并从大到小排序
public static ArrayList<Integer> sortMethod(ArrayList<Integer> list){ // map的左边存放值,右边存放出项的次数 HashMap<Integer, Integer> map = new HashMap<>(); for (Integer integer : list) { if(map.get(integer) ==原创 2021-03-04 16:48:00 · 141 阅读 · 1 评论 -
秋招笔试题思考
一个ArrayList,数字范围为[0,1024],将其中的奇数按照从大到小的顺序输出 TreeSet<Integer> set = new TreeSet<>(new Comparator<Integer>(){ @Override public int compare(Integer integer, Integer t1) { return t1.compareTo(i原创 2020-12-03 13:39:40 · 141 阅读 · 0 评论