基础算法题
NaNaBf
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
50.二叉搜索树第k小的结点
题目:给定一棵二叉搜索树,请找出其中的第k小的结点。解析:二叉搜索树的左子树的结点小于根节点,右子树的结点大于根节点。左右子树同样的满足该条件。其实中序遍历二叉树就是按照从小到大的顺序输出。①利用迭代对二叉搜索树进行中序遍历;②定义变量k,每访问一个节点就将--k,直到k=0,此时将要访问第k小的结点;TreeNode KthNode(TreeNode pRoot, int k)...原创 2019-07-11 12:48:25 · 282 阅读 · 0 评论 -
39.二叉树的后序遍历
题目:二叉树的后序遍历解析:1.递归遍历public List<Integer> postorderTraversal1(TreeNode root) { List<Integer> list = new ArrayList<Integer>(); if (root == null) return list; postorder(root,l...原创 2019-06-25 13:10:53 · 227 阅读 · 0 评论 -
37.二叉树的前序遍历
题目:前序遍历二叉树解析:1.递归遍历public List<Integer> preorderTraversal1(TreeNode root) { List<Integer> list = new ArrayList<Integer>(); if (root == null) return list; preOrder(root,list)...原创 2019-06-21 13:03:30 · 190 阅读 · 0 评论 -
30.合并两个有序的链表
题目: 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。解析:递归①比较两个有序链表p1和p2的当前结点值,如果p1的结点值大于p2的结点值,将当前p2的结点指向当前p1结点,否则当前p1结点指向当前p2结点;②接下来在比较p1结点的下一结点和p2结点或比较p2结点的下一结点和p1结点;③重复①②直到递归条件结束。 public ListNo...原创 2019-06-11 12:12:49 · 881 阅读 · 0 评论 -
36.层次遍历二叉树
题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印。解析:1.所有节点全部放入一个List中①创建队列Queue,开始将根节点add进队里中;②取出队列中的结点,将该节点加入List中;③再将该节点的左、右结点add进Queue队列中;④循环②③步骤,直到Queue队列为空,所有节点全部被添加进List中;public ArrayList<Integer> Pri...原创 2019-06-20 13:16:34 · 179 阅读 · 0 评论 -
35.奇偶链表
题目:给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。解析:①新建两个链表结点p1和p2分别连接单链表中奇数结点和偶数结点;②定义计数count,遍历链表,如果当前结点计数count为奇数,将该节点连接到p1后,如果该当前结点计数为偶数,将该节点连接到p2后;③链表遍历完成后,p1和p2后分别挂着奇数结...原创 2019-06-19 12:54:49 · 206 阅读 · 0 评论 -
27.两个链表的第一个公共结点
题目:输入两个链表,找出它们的第一个公共结点。解析:这题严谨的做法应该是先判断两个链表相交是否有环,下面两种做法是可以合并一起的,即有环选1,没换选2。1.有环的做法①定义一个快指针(一次移动一个结点)指向第一个链表和一个慢指针(一次移动两个结点)指向第二个链表,同时从链表头移动;②如果链表相交后结点成环,快慢指针一定会在环里相遇,记录此时相遇的结点;③定义另一指针指向其中一链表的头部,...原创 2019-06-03 12:43:42 · 217 阅读 · 0 评论 -
33.删除链表的倒数第 n 个节点
题目:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。例如:给定一个链表: 1->2->3->4->5, 和 n = 2当删除了倒数第二个节点后,链表变为 1->2->3->5.解析:前面有一题是输出倒数第k个结点。稍微变一点就可以。1.常规做法①首先遍历链表,获取链表的长度len;②删除倒数第n个结点转换成删除顺数第le...原创 2019-06-14 13:20:52 · 206 阅读 · 0 评论 -
32.回文链表
题目:请判断一个链表是否为回文链表。解析:1.利用栈求解①首先遍历链表获取链表的长度len;②根据链表的长度,将链表的前半部分压入栈,将后半部分依次与弹栈的元素比较看是否一致,一致则为回文链表;③这里注意的是链表的后半部分的开始位置(链表长度的奇偶)。public boolean isPalindrome1(ListNode head) { if (head == null) r...原创 2019-06-13 12:55:20 · 189 阅读 · 0 评论 -
24.数组中的K-diff数对
题目:给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对。这里将 k-diff 数对定义为一个整数对 (i, j), 其中 i 和 j 都是数组中的数字,且两数之差的绝对值是 k。输入: [3, 1, 4, 1, 5], k = 2输出: 2解释: 数组中有两个 2-diff 数对, (1, 3) 和 (3, 5)。尽管数组中有两个1,但我们只应返回不同的数对的...原创 2019-05-29 13:11:17 · 388 阅读 · 0 评论 -
26.从尾到头打印链表
题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。解析:这个就利用Stack先进后出的思想来做。简单代码如下:public ArrayList<Integer> printListFromTailToHead(ListNode listNode){ ArrayList<Integer> arrayList = new ArrayList&l...原创 2019-05-31 13:00:08 · 164 阅读 · 0 评论 -
31.删除链表中重复元素
题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点。解析:1.保留重复的结点例:1->1->2①比较当前结点的值与下一结点的值,如果相同,则当前结点指向下一结点的下一结点;②如果当前结点的值与下一结点的值不同,则当前结点移动到下一结点。③根据上述思路,由于当前结点的值1和下一结点的值1相同,则当前结点指向下一结点的下一节点,即1->2。public ...原创 2019-06-12 13:01:46 · 246 阅读 · 0 评论 -
34.两两交换链表中的结点
题目:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。解析:①用递归的做法,先交换当前两个结点;②将交换后的尾结点指向下个要交换的结点;③重复上述步骤①②,直到后面只有一个节点或没有结点。 public ListNode swapPairs(ListNode head) { if (head == null) return nu...原创 2019-06-18 13:16:52 · 201 阅读 · 0 评论 -
40.前序和中序遍历重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解析:①首先根据前序遍历可知,前序序列的第一个元素为根节点,即1为根节点;②在中序遍历序列中找到1所在的位置,1之前的序列为左子树,即{4,7,2}为...原创 2019-06-26 12:59:43 · 280 阅读 · 0 评论 -
44.二叉树中和为某一值的路径
题目:输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)解析:①从根节点开始递归访问左子树同时将给出的整数减去访问的结点值,当叶子结点的值等于剩余整数时,说明该路径满足条件,将其保存到List中;②不管满不满足条件,都对访问过的结点后退一步...原创 2019-07-01 13:15:25 · 180 阅读 · 0 评论 -
49.之字形打印二叉树
题目:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。 解析:在层次遍历二叉树的基础上改变不同行的打印顺序 ①层次遍历二叉树; ②在层次遍历二叉树的基础上对层数进行判断该层是奇数层还是偶数层; ③...原创 2019-07-10 12:51:23 · 177 阅读 · 0 评论 -
46.二叉树的深度
以下三题都是关于二叉树深度的问题题目1:输入一棵二叉树,求该树的深度(最大)。注意:从根结点到叶结点依次经过的结点(含根、叶结点),形成树的一条路径,最长路径的长度为树的深度解析:1.递归(左右子树的最大深度+1即为此二叉树的深度)public int TreeDepth(TreeNode root) { if (root == null) return 0; int leftD...原创 2019-07-04 13:03:35 · 510 阅读 · 0 评论 -
43.二叉树后序遍历的结果
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解析:二叉搜索树为二叉树左节点小于根节点,右节点大于根节点;①[5, 7, 6, 9, 11, 10, 8]数组中最后一位元素8为二叉搜索树的根节点,从后往前找到所有连续比根节点8大的数即为根节点8的右子树,记录此时的位置索引index;②如果该数组...原创 2019-06-28 13:03:06 · 803 阅读 · 0 评论 -
42.二叉树的镜像
题目:操作给定的二叉树,将其变换为源二叉树的镜像。解析:二叉树的镜像只要交换二叉树的左右结点就行。public void Mirror(TreeNode root) { if (root != null){ TreeNode node = root.left;//保存左节点 root.left = ...原创 2019-06-28 12:38:15 · 171 阅读 · 0 评论 -
48.对称二叉树
题目:请实现一个函数,用来判断一颗二叉树是不是对称的。注意如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的解析:其实用递归很简单,递归判断二叉树的左右子树是否为对称的(画个图就知道了)boolean isSymmetrical(TreeNode pRoot){ if (pRoot == null) return true; return doSymmetri...原创 2019-07-09 13:04:50 · 224 阅读 · 0 评论 -
45.二叉树转链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解析:二叉搜索树:左子树结点值大于右子树结点值①定义一个转换函数convertnode将root结点传进去做转换树为链表的操作;②在convertnode函数中,判断root是否有左子树,有则继续调用convertnode函数将root.left传进去将左子树转化为链表;同...原创 2019-07-03 12:32:59 · 769 阅读 · 0 评论 -
41.二叉树的子结构
题目:输入两棵二叉树A,B,判断B是不是A的子结构。解析:①从二叉树A的根节点root开始,判断此时二叉树B是否以root开始且以下结点与二叉树A是否相等,用变量ret保存返回的布尔变量(为什么不直接return,因为B可能从A根节点的右孩子开始为其子结构或左孩子开始为其子结构);②如果A树有右孩子,将右孩子当做B树的根节点,判断B树是否以此节点为开始是A树的子结构;同样的如果A树有左孩子,...原创 2019-06-27 12:50:15 · 365 阅读 · 0 评论 -
47.二叉树下一结点
题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。解析:给出二叉树的当前结点,获取中序遍历顺序中当前结点的下一结点①首先判断当前结点是否有当前结点;②如果当前结点有右结点,则以该右结点为根节点,遍历根节点直到最左节点;③如果当前结点没有右结点:(有两种情况)a.如果当前结点是根节点,那么中序遍历后的...原创 2019-07-08 13:04:04 · 181 阅读 · 0 评论 -
38.二叉树的中序遍历
题目:中序遍历二叉树解析:1.递归遍历public List<Integer> inorderTraversal1(TreeNode root) { List<Integer> list = new ArrayList<Integer>(); if (root == null) return list; inOrder1(root,list);...原创 2019-06-24 13:07:22 · 285 阅读 · 0 评论 -
29.链表中倒数第k个结点
题目:输入一个链表,输出该链表中倒数第k个结点解析:这里提供两种解法,还有一种用栈的解法解法1:①遍历一遍链表,获取链表的长度len;②用链表长度len减去k,此时变成输出顺数第len-k+1个节点了; public ListNode FindKthToTail1(ListNode head,int k) { if (head == null) return null; in...原创 2019-06-05 13:14:11 · 174 阅读 · 0 评论 -
28.反转链表
题目:输入一个链表,反转链表后,输出新链表的表头。解析:①定义一个当前指针head指向当前结点,一个前向指针pre指向前一结点;②初始的当前指针为头结点,前向指针为null,因为链表反转后头结点指向null;③遍历链表,将当前结点head指向前向结点pre,此时pre需要作为下一个节点的前向结点,因此赋为当前结点head。当前结点head移动到下个结点,重复上述操作,知道链表遍历完。pu...原创 2019-06-05 12:32:25 · 177 阅读 · 0 评论 -
13.圆圈中剩下最后的数
题目描述:让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列,不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,求最后一个小朋友。解析:①首先将所有元素装入list集合中;②如果m-1大于n,则需要计算m-1 % n的余数;③删除list中以余数为下标的元素,此时list的长度已经更新;...原创 2019-05-19 12:51:05 · 200 阅读 · 0 评论 -
10.字符串中的单词数
题目描述:统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。解析:1.空格分割①以空格分割字符串,空格可能有多个,因此用正则“\s+”;②分割后的字符数组可能有空字符,因此需要去除空字符。public int countSegments1(String s){ if (s == null || s.length() == 0){ return 0;...原创 2019-05-06 22:04:19 · 273 阅读 · 0 评论 -
6.最长回文子串
题目要求:给定一个字符串 s,找到 s 中最长的回文子串。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”解析:1.暴力破解,时间复杂度O(n^3)①首先判断输入的合法性,不合法输出空字符串,即输入字符串为null或为空;②输入字符串至少有一个字符,则初始最长回文子串为1;③从字符串开头进...原创 2019-04-24 21:11:18 · 153 阅读 · 0 评论 -
9.字符串中的第一个唯一字符
题目:给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。案例:s = “leetcode”返回 0.s = “loveleetcode”,返回 2.解析:1.定义与字符对应的数组①定义容量为26的数组,分别对应26个字符,a-z;②遍历字符串,字符出现一次,对应的数组位计数加1;③输出对应数组位为1的字符下标。public int firs...原创 2019-05-04 22:17:18 · 407 阅读 · 0 评论 -
3.字符串翻转
1.给定任意字符串,进行翻转public String strreverse1(String str){ if (str == null) return ""; char[] chars = str.toCharArray(); int start = 0, end = chars.length-1; while(end&g...原创 2019-04-19 21:17:01 · 1004 阅读 · 0 评论 -
8.字母异位分组
题目描述:给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],输出:[[“ate”,“eat”,“tea”],[“nat”,“tan”],[“bat”]]所有输入均为小写字母。不考虑答案输出的顺序。解析:①将字符串数组中的每一个字符串转成字符...原创 2019-04-28 22:51:57 · 252 阅读 · 0 评论 -
2.字符串转数字
①首先判断正负号问题;②遍历字符串中的每一个字符,将其转化成数字;③考虑int溢出问题(重要);④得到最终的结果,带上正负号;溢出判断1:public int Strtoint(String str){ //判断输入是否合法,不合法返回0 if(str == null || str.trim().length() == 0){ //必须先判断str==null...原创 2019-04-18 20:51:12 · 499 阅读 · 0 评论 -
7.重复的字符串
题目描述:给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。示例 1:输入: “abab”输出: True解释: 可由子字符串 “ab” 重复两次构成。示例 2:输入: “aba”输出: False示例 3:输入: “abcabcabcabc”输出: True解析:1.去头加去尾拼接①去除输入字符串的头字符拼接一个去除尾字符的字符串;②判断拼接后的字符串中...原创 2019-04-26 21:05:53 · 516 阅读 · 0 评论 -
1.数字转换字符串
将int类型数字转换成字符串①将数字从个位开始依次取出--取余②得到的字符串是逆序的,需要翻转处理public class NumToStr { public static void main(String[] args) { int num = 1234; String str = ""; String newstr = ""; while (num!=...原创 2019-04-17 20:01:44 · 261 阅读 · 0 评论 -
5.无重复字符的最长子串
题目描述:找出其中不含有重复字符的最长子串的长度1.暴力破解①从第一个字符开始,遍历到最后一个字符。②如果有重复的字符出现,记录此时无重复的长度,跳出第一次的遍历,从第二个字符开始遍历,同样如果有重复字符出现,记录无重复的长度,循环继续。。。③比较所有无重复的长度,选出最长的数值。//时间复杂度O(n*n),算法最劣 public int norepeatstr1(...原创 2019-04-21 22:29:13 · 236 阅读 · 0 评论 -
14.数组中只出现一次的数字
题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字num1,num2分别为长度为1的数组。传出参数将num1[0],num2[0]设置为返回结果。解析:方法1:list/set集合①for循环遍历数组,将数组中的元素全部存入list集合中;②如果list集合中存在重复元素,则删除该重复元素;③剩下的两个均为非重复元素。public vo...原创 2019-05-19 13:33:57 · 163 阅读 · 0 评论 -
15.和为S的连续正数序列
题目:输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序。例:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和, 他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的...原创 2019-05-20 12:49:14 · 159 阅读 · 0 评论 -
12.数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解析:1.不好表达,直接上代码public int MoreThanHalfNum_Solution1(int[] array) { if (array == null...原创 2019-05-10 22:27:26 · 151 阅读 · 0 评论 -
23.合并两个有序数组
题目:给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。说明:初始化 nums1 和 nums2 的元素数量分别为 m 和 n。你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。示例:输入:nums1 = [1,2,3,0,0,0], m = 3nums2 = ...原创 2019-05-28 13:04:31 · 220 阅读 · 0 评论
分享