草庐IT

每日一题

全部标签

每日算法之二叉搜索树与双向链表

JZ36二叉搜索树与双向链表描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表注意:1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继2.返回链表中的第一个节点的指针3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构4.你不用输出双向链表,程序会根据你的返回值自动打印输出思路:二叉树中序遍历除了递归方法,我们还可以尝试非递归解法,与常规的非递归中序遍历几乎相同,还是借助栈来辅助,只是增加了连接节点。具体做法:step1:创建两个指针,一个指向题目中要求的链表头(head),

每日算法之把数组排成最小的数

JZ45把数组排成最小的数描述输入一个非负整数数组numbers,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组[3,32,321],则打印出这三个数字能排成的最小数字为321323。1.输出结果可能非常大,所以你需要返回一个字符串而不是整数2.拼接起来的数字可能会有前导0,最后结果不需要去掉前导0具体做法step1:优先判断空数组的特殊情况。step2:将数组中的数字元素转换成字符串类型。step3:重载排序比较为字符串类型的x+ystep4:将排序结果再按照字符串拼接成一个整体。代码packagemid.JZ45把数组排成最小的数;importjava

每日算法之把数组排成最小的数

JZ45把数组排成最小的数描述输入一个非负整数数组numbers,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组[3,32,321],则打印出这三个数字能排成的最小数字为321323。1.输出结果可能非常大,所以你需要返回一个字符串而不是整数2.拼接起来的数字可能会有前导0,最后结果不需要去掉前导0具体做法step1:优先判断空数组的特殊情况。step2:将数组中的数字元素转换成字符串类型。step3:重载排序比较为字符串类型的x+ystep4:将排序结果再按照字符串拼接成一个整体。代码packagemid.JZ45把数组排成最小的数;importjava

每日算法之把数字翻译成字符串

JZ46把数字翻译成字符串描述有一种将字母编码成数字的方式:'a'->1,'b->2',...,'z->26'。现在给一串数字,返回有多少种可能的译码结果示例1输入:"12"返回值:2说明:2种可能的译码结果(”ab”或”l”)思路思路:对于普通数组1-9,译码方式只有一种,但是对于11-19,21-26,译码方式有可选择的两种方案,因此我们使用动态规划将两种方案累计。具体做法:step1:用辅助数组dp表示前i个数的译码方法有多少种。step2:对于一个数,我们可以直接译码它,也可以将其与前面的1或者2组合起来译码:如果直接译码,则dp[i]=dp[i−1];如果组合译码,则dp[i]=dp

每日算法之把数字翻译成字符串

JZ46把数字翻译成字符串描述有一种将字母编码成数字的方式:'a'->1,'b->2',...,'z->26'。现在给一串数字,返回有多少种可能的译码结果示例1输入:"12"返回值:2说明:2种可能的译码结果(”ab”或”l”)思路思路:对于普通数组1-9,译码方式只有一种,但是对于11-19,21-26,译码方式有可选择的两种方案,因此我们使用动态规划将两种方案累计。具体做法:step1:用辅助数组dp表示前i个数的译码方法有多少种。step2:对于一个数,我们可以直接译码它,也可以将其与前面的1或者2组合起来译码:如果直接译码,则dp[i]=dp[i−1];如果组合译码,则dp[i]=dp

每日算法之礼物的最大价值

JZ47礼物的最大价值描述描述在一个m\timesnm×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?如输入这样的一个二维数组,[[1,3,1],[1,5,1],[4,2,1]]那么路径1→3→5→2→1可以拿到最多价值的礼物,价值为12具体做法:step1:初始化第一列,每个元素只能累加自上方。step2:初始化第一行,每个元素只能累加自左方。step3:然后遍历数组,对于每个元素添加来自上方或者左方的较大值。代

每日算法之礼物的最大价值

JZ47礼物的最大价值描述描述在一个m\timesnm×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?如输入这样的一个二维数组,[[1,3,1],[1,5,1],[4,2,1]]那么路径1→3→5→2→1可以拿到最多价值的礼物,价值为12具体做法:step1:初始化第一列,每个元素只能累加自上方。step2:初始化第一行,每个元素只能累加自左方。step3:然后遍历数组,对于每个元素添加来自上方或者左方的较大值。代

每日算法之最长不含重复字符的子字符串

JZ48最长不含重复字符的子字符串描述请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。示例1输入:"abcabcbb"返回值:3说明:因为无重复字符的最长子串是"abc",所以其长度为3。方法1思路维护一个数组,想里面添加元素,直至出现第一个重复元素位置,计算数组长度作为一次结果将每一个元素都作为开始元素,利用两次for,将全部不重复子字符串全部计算出来,取出最大数代码intmax=Integer.MIN_VALUE;Listtmp=newArrayList();if(s==null&&s.length()==0)return0;for(inti=0;i方法2思路

每日算法之最长不含重复字符的子字符串

JZ48最长不含重复字符的子字符串描述请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。示例1输入:"abcabcbb"返回值:3说明:因为无重复字符的最长子串是"abc",所以其长度为3。方法1思路维护一个数组,想里面添加元素,直至出现第一个重复元素位置,计算数组长度作为一次结果将每一个元素都作为开始元素,利用两次for,将全部不重复子字符串全部计算出来,取出最大数代码intmax=Integer.MIN_VALUE;Listtmp=newArrayList();if(s==null&&s.length()==0)return0;for(inti=0;i方法2思路

每日算法之丑数

JZ49丑数题目我们先看到题目,把只包含质因子2、3和5的数称作丑数(UglyNumber)。例如6、8都是丑数,但14不是,因为它包含质因子7。习惯上我们把1当做是第一个丑数。方法1:质因数分解(暴力)思路算法实现一个很朴素的做法从1~n每次+1,一直枚举,直到找到地N个丑数为止那么还有一个待解决的问题,如何判断当前数字是不是丑数呢?我们总结一下丑数的性质:只能分解为2,3,5的如干次幂相乘的数,即设第个丑数为,则res=2*x+3*y+5*z那么我们只需要通过质因数分解,判断他分解2,3,5后,是否为1,如果为1,则说明没有其他的因数,否则则有其他因数,那么他就不是一个丑数问题当输入数过大