数据结构与算法
壶酒慰尘
啦啦啦
展开
-
将字符串转化为整数
Java内部实现/* @param s the {@code String} containing the integer * representation to be parsed * @param radix the radix to be used while parsing {@code s}. ...原创 2018-09-23 16:51:04 · 896 阅读 · 0 评论 -
回溯之八皇后
转自http://blog.csdn.net/tianyaleixiaowu八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单。 下面用Java版的回溯算法来解决八皇后问题。 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能转载 2017-08-29 20:32:20 · 277 阅读 · 1 评论 -
回溯之矩阵中的路径
题目请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abcb”路径,因为字符串的第一个字符b占据了矩阵中原创 2017-08-29 20:27:34 · 255 阅读 · 0 评论 -
回溯之机器人的运动范围
题目地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?思路递归,判断每一次递归 1.不能越界 2.没走过原创 2017-08-29 20:23:18 · 208 阅读 · 0 评论 -
序列化二叉树
题目请实现两个函数,分别用来序列化和反序列化二叉树思路 前序遍历(中左右),递归/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*原创 2017-08-28 21:02:23 · 206 阅读 · 0 评论 -
按之字形顺序打印二叉树
题目请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路使用两个栈来储存相邻两层的节点,保证顺序 储存后的栈在下一层依次弹出节点,同时使用另一个栈保存再下一层的节点public class Solution { public ArrayList<ArrayList<Integer> > Prin原创 2017-08-28 17:20:47 · 241 阅读 · 0 评论 -
对称的二叉树
题目请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路递归 1 2 2 3 4 4 3 比较左子树的左节点和右子树的右节点 比较左子树的右节点和右子树的左节点public class Solution { boolean isSymmetrical(TreeNode pRoot) {原创 2017-08-28 16:17:11 · 201 阅读 · 0 评论 -
二叉树的下一个节点
题目给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路链接:https://www.nowcoder.com/questionTerminal/9023a0c988684a53960365b889ceaf5e来源:牛客网public class Solution { TreeLinkNode GetNe原创 2017-08-28 15:36:42 · 165 阅读 · 0 评论 -
链表中环的入口节点
题目一个链表中包含环,请找出该链表的环的入口结点。思路1用容器ArrayList保存每个走过的节点,遇到重复的即返回思路2断环法,不留后路,断开每一个走过节点的指向,最后一个节点指向空思路3设置一快一慢两个指针,fast速度为slow的2倍,第一次相遇,fast路程为slow路程2倍,列等式 x:环外路程 c:环路程 a:环中相遇时走过的路程 fast = x+mc+a; slow = x+n原创 2017-08-27 20:27:46 · 242 阅读 · 0 评论 -
丑数
题目把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路动态规划 将丑数依次存储到数组中,并根据求得的丑数来求未知丑数代码public int GetUglyNumber_Solution(int index) { if(index<7)原创 2017-08-23 17:34:33 · 182 阅读 · 0 评论 -
整数中1出现的次数
题目求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。 思路及代码参考自链接思路观察 1~n 十进制数每一位1出现的次数每一位大于1 543 个位1:54*1+原创 2017-08-23 16:06:20 · 256 阅读 · 0 评论 -
把数组排成最小的数
题目输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路将数据放到容器中,新建一种比较规则:相邻两个整数拼接后比较,然后进行排序。import java.util.ArrayList;import java.util.Collections;import java.ut原创 2017-08-23 15:32:13 · 203 阅读 · 0 评论 -
表示数值的字符
题目请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。思路1正则表达式链接:https://www.nowcoder.com/questionTerminal/6f8c901d091949a58原创 2017-08-26 20:40:37 · 303 阅读 · 0 评论 -
正则表达式匹配
题目请实现一个函数用来匹配包括’.’和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配思路链接:https://www.nowcoder.com/questionTerminal/45327a原创 2017-08-26 17:46:44 · 253 阅读 · 0 评论 -
约瑟夫环
题目圆圈中最后剩下的数,n个数从零开始去掉第m个数,然后从下一个数重新开始思路0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 3 4 5 6 7 5 6 0 1 2 3 40 1 3 4 6 7 2 3 4 5 0 1最后一轮只剩一个数,为所求,编号为0, f(1)=0 在倒数第二轮中编号为(0+m)%2, f(2)=(f(1)+m)%2 在倒数第三轮中编号为原创 2017-08-26 16:26:00 · 175 阅读 · 0 评论 -
扑克牌顺子
题目LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…..LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张原创 2017-08-26 12:08:49 · 188 阅读 · 0 评论 -
反转单词顺序列
题目牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思路首先反转整个字符串 然后反转原创 2017-08-26 11:12:29 · 331 阅读 · 0 评论 -
字符串排列
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。链接:https://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7来源:牛客网基于回溯法: public ArrayList Perm...原创 2018-03-15 18:12:14 · 141 阅读 · 0 评论 -
给 n 对括号,写一个函数生成所有合适的括号组合。
题目给 n 对括号,写一个函数生成所有合适的括号组合。思路给出一个整数n,那么生成的合法括号串的长度是2 * n,那么运用递归去枚举每个位置上的可能出现的字符(,),枚举的时候要注意,当前位置可以放(,但是能不能放)就要看到目前为止放了多少个),如果(的个数比)多,那么当前位置就可以放),这其实和用栈验证括号串的合法性的思想是一样的。 原文链接代码public class M...原创 2018-03-30 21:46:26 · 3370 阅读 · 1 评论 -
找出数组中只出现一次的两个数
题目给一组数,只有两个数只出现了一次,其他所有数都是成对出现的。怎么找出这两个数思路异或消除成对数据代码class Solution { public void findTwoSingle(int[] nums) { int ret = 0; for (int i = 0; i &amp;amp;lt; nums.length; i++) { ...原创 2018-08-21 18:21:02 · 242 阅读 · 0 评论 -
sqrt(int n)求平方根,牛顿法
思路https://www.guokr.com/question/461510/ f(x) = x*x-r 求导公式 f’(x) = (f(xn)-0)/(xn-xn1) xn1 = xn-f(xn)/f’(xn)=(xn+r/xn)/2.0代码public double sqrt(double x) { double eps = 1e-...转载 2018-04-25 12:05:53 · 439 阅读 · 0 评论 -
打印1到最大的n位数
题目输入数字n,按顺序打印出从1到最大的n位十进制数。比如,输入3,则打印出1,2,3,…..,一直到最大的3位数即999思路考虑大数,使用数组或stringbuilder构造每一个数,直接打印或使用StringBuilder构造输出字符串 全排列的思想,每一位都可以是0-9,首位不能为0,直接构造n位数,不考虑数字为为0的情况,000, 001,002,···,999,构造输出...原创 2018-04-14 11:11:53 · 167 阅读 · 0 评论 -
二进制中1的个数
题目一个int整数二进制中1的个数思路11左移31次,按位与32次,结果分为零和非零两种情况;思路2把一个整数减去1后再和原来的整数做位与运算,可以将最右边为1的那一位变成0,左边为1的位不变,循环到结果为0时终止,可以不计算32次。 100 011&100=0 1 110 101&110=100 011&100=0 2代码sta...原创 2018-04-13 21:22:32 · 144 阅读 · 0 评论 -
两个栈实现队列
题目使用两个栈实现一个队列,队尾添加,队头删除思路Java弃用Vector,同理弃用实现Vector接口的Stack,使用LinkedList作为栈 一个一栈用于添加,一个二栈用于删除 每次删除前检查二栈是否为空,若为空,将一栈内全部对象依次移至二栈,然后从二栈弹出数据,若不为空,直接弹出二栈顶部数据代码public class Queue<T> { ...原创 2018-04-13 20:12:14 · 175 阅读 · 0 评论 -
最长递增子序列长度
题目最长递增子序列长度思路动态规划状态 maxlen[i] 下标为i时,i及之前最长递增子序列长度 maxlen[0] = 1状态转移 遍历i之前节点j if(a[i]>a[j])maxlen[i] = Math.max(maxlen[i],maxlen[j]+1);代码public class Main { public static vo...原创 2018-04-06 21:25:41 · 187 阅读 · 0 评论 -
最长公共子序列
题目给出两个字符串,求出这样的一个最长的公共子序列的长度:子序列中的每个字符都能在两个原串中找到, 而且每个字符的先后顺序和原串中的先后顺序一致。思路动态规划状态 定义一个二维数组maxCommon[i][j],1字符串中前i个字符和2字符串中前j个字符公共子序列长度初始状态 maxCommon[i][0] = 0 maxCommon[0][j] = 0状态转移 ...原创 2018-04-06 20:31:57 · 160 阅读 · 0 评论 -
动态规划之01背包问题、完全背包问题
题目有n 个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?思路动态规划初始状态 定义一个二维数组,存放状态,前i个物品放入大小为j的包中最大价值状态转移 dp[i][j] 如果容量不够,价值等于前i-1同等容量j的价值 如果容量大于等于,价值等于前i-1容量j-weight[i]的价值+value[i];代码二维数...原创 2018-04-06 19:53:54 · 630 阅读 · 0 评论 -
二叉树的最近公共父节点
题目求二叉树两个节点的最近公共父节点思路递归,边界条件为空节点或两个节点的其中一个 如果node的左节点是a,b的公共父节点,则在其右子树中尝试查询a,b最后结果必然是NULL,反之亦然。 所以当node的左右节点查询结果都不为空的时候,说明该点就是最近公共父节点。代码TreeNode lowestCommonAncestor(TreeNode root, TreeNo...原创 2018-04-11 20:51:28 · 4657 阅读 · 1 评论 -
连续子数组最大和
题目连续子数组最大和 一个数组的所有连续子数组中的最大和思路max sum 如果前面连续数组小于等于0,sum从此数开始,依次相加 如果前面连续数组大于0,sum加上此数 输入数组为字符串时,考虑大数代码 BigInteger max = nums[0]; BigInteger zero = new BigInteger...原创 2018-03-28 22:09:54 · 176 阅读 · 0 评论 -
16进制转10进制
题目16进制转10进制思路循环乘进制加下一位 用Java api 考虑大数代码import java.math.BigInteger;import java.util.*;public class Main{ public static void main(String[] args){ Scanner scan = new Scanner...原创 2018-03-28 10:36:41 · 476 阅读 · 0 评论 -
字符串分割
题目连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; 长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。思路非8倍长度,先补0,然后使用substring切割代码链接:https://www.nowcoder.com/questionTerminal/d9162298cb5a437aad722fccccaae8a7来源:牛客网impo...原创 2018-03-28 09:57:43 · 165 阅读 · 0 评论 -
LRU实现
使用LinkedHashMap,特性是插入有序 重写removeEldestEntry(Map.Entry eldest)方法/** * Returns <tt>true</tt> if this map should remove its eldest entry. * This method is invoked by <tt>pu...原创 2018-04-15 16:11:29 · 371 阅读 · 0 评论 -
二叉树节点和最大路径,输出节点
题目二叉树最长路径,输出节点思路前序遍历,比较每一条路径的节点和,保留最长路径代码 static LinkedList<TreeNode> result; static void LongPath(TreeNode root, LinkedList<TreeNode> list, int sum, int max) { list.p...原创 2018-04-15 01:19:15 · 2611 阅读 · 0 评论 -
二叉树的深度/二叉树路径和
题目输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路递归,从叶子节点到根节点,判断每一分支的深度,选择更大的代码public class Solution { public int TreeDepth(TreeNode root) { if(null==root) ...原创 2018-04-09 18:46:46 · 445 阅读 · 0 评论 -
O(1)删除链表节点
题目给定单向链表的头指针和某节点指针,定义一个函数在O(1)时间删除该节点思路复制,将待删除结点的下一个节点数据复制给带删除节点,然后删除待删除节点的下一个节点,需要考虑待删除节点为尾节点,或链表仅有一个节点代码void deletedelNode(Node head, Node delNode){ if(null==delNode||null==head) ...原创 2018-04-14 13:38:42 · 504 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路1使用map思路2摘自牛客网 采用阵地攻守的思想: 第一个数字作为第一个士兵,守阵地;count = 1; 遇到相同元素,count++; 遇到不相同元素,即为敌人,同归于尽,cou原创 2017-08-22 21:14:12 · 186 阅读 · 0 评论 -
和为S的两个数字
题目输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。思路递增有序数组 使用头部和尾部两个指针 判断两数相加结果决定头指针右移或尾指针左移 第一次遇见符合条件的数字即为所求结果 终止条件为两指针相遇 性能优化 首先使用二分查找寻找sum/2的位置,该位置为终止条件public class Solution {原创 2017-08-26 10:04:08 · 186 阅读 · 0 评论 -
和为s的连续正数序列
题目小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!思路参考自牛客网@辉88 数学方法,等差求和 首项原创 2017-08-25 22:02:35 · 165 阅读 · 0 评论 -
不用加减乘除做加法
题目思路根据题目描述,只要没有+、-、*、/符号即可 第一时间想到的是位运算,只是不知道怎么做,于是。。。我的正确答案采用++,–public class Solution { public int Add(int num1,int num2) { if(num2>0){ for(int i=0; i<num2; i++){原创 2017-07-03 17:22:59 · 183 阅读 · 0 评论 -
求1+2+3+...+n,不用乘除法,循环判断语句
题目思路法1.采用递归,利用逻辑与的短路特性法2. 调用Java库函数代码链接:https://www.nowcoder.com/questionTerminal/7a0da8fc483247ff8800059e12d7caf1来源:牛客网public class Solution { int Sum_Solution(int n) { ...原创 2017-07-23 16:01:29 · 1130 阅读 · 0 评论