![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 75
糟糕点师
这个作者很懒,什么都没留下…
展开
-
一天一算法(46):第一个出现一次的字符
题目在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).思路注意看,字符要区分大小写,所以这道题难度就上去一点了,但是还是简单的。一共有两种解题方法,一种是利用字典去统计字符出现的次数,一种是利用数组去统计字符出现的次数思路一:字典求解using System.Collectio...原创 2019-11-08 13:16:33 · 143 阅读 · 0 评论 -
一天一算法(45):把数组排成最小的数
题目输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路这道题本质是一个排序题目,只不过排序的条件变成了将两个数组合起来再比较大小。所以这道题利用冒泡排序就能搞定,其他排序算法也ok。代码using System.Text;using System;clas...原创 2019-11-06 12:42:44 · 136 阅读 · 0 评论 -
一天一算法(44):连续子数组的最大和
题目HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和...原创 2019-11-01 16:35:25 · 97 阅读 · 0 评论 -
一天一算法(43):最小k个数
题目输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路超级简单的题目,就是考察排序算法而已代码为了熟悉堆排序,使用了堆排using System.Collections.Generic;class Solution{ public List<int> GetLeastNumbers_So...原创 2019-10-31 16:45:16 · 167 阅读 · 0 评论 -
一天一算法(43):数组中出现次数超过一半的数字
题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。我的思路比较简单的题目,可以用好多做法来实现。我是使用字典来实现数字出现次数的统计的,因为字典的key是唯一的,所以将数组中的数字作为字典的key就可以快速的实现数字出现次数的统计...原创 2019-10-30 15:59:01 · 96 阅读 · 0 评论 -
一天一算法(42):二叉搜索树与双向链表
题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路二叉搜索树的特点就是左子树的值小于父节点,右子树的值大于父节点。所以使用二叉树的中序遍历就可以得到排序的链表了。代码using System.Collections.Generic;/*public class TreeNode{ public int ...原创 2019-10-23 15:27:38 · 105 阅读 · 0 评论 -
一天一算法(41):复杂链表的复制
题目输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路这道题的难点就在于链表节点的特殊指针的复制,因为特殊指针是指向随机节点的,所以没法边复制节点边获取特殊指针。因此比较简便的方法是在原链表的每个节点后面增加他的复制节点:...原创 2019-10-22 16:40:38 · 114 阅读 · 0 评论 -
一天一算法(40):二叉树中和为某值的路径
题目输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)思路又题目可知,正确的路径必须满足两个条件:一是路劲的节点的值之和等于给定的值,二是路劲必须是根节点到叶子节点。这里我使用了二叉树的非递归前序遍历,利用栈来存储路径。代码using S...原创 2019-10-22 12:42:12 · 87 阅读 · 0 评论 -
一天一算法(39):二叉搜索树的后序遍历序列
题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路这个是一个二叉搜索树,所以他的左子树小于根节点,右子树大于根节点。根节点的值就是后序遍历的最后一个值了。代码class Solution{ public bool VerifySquenceOfBST(int[] sequence)...原创 2019-10-18 11:03:36 · 83 阅读 · 0 评论 -
一天一算法(38):从上往下打印二叉树
题目从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路这不就是个二叉树的层次遍历吗代码using System.Collections.Generic;/*public class TreeNode{ public int val; public TreeNode left; public TreeNode right; public Tre...原创 2019-10-17 10:34:50 · 129 阅读 · 0 评论 -
一天一算法(37):栈的压入,弹出序列
题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)代码using System.Collections.Generic;class So...原创 2019-10-16 10:37:15 · 73 阅读 · 0 评论 -
一天一算法(36):包涵MIN函数的栈
题目定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。题解要求时间复杂度为O(1),意味着无论数据量为多少,min函数所需的时间都一样长。所以只能使用push和pop来决定min函数的输出。所以我们要定义一个List来存储min值,当push的时候判断是否应该添加元素到List,pop的时候判断是否要移除List的元素。代码using ...原创 2019-10-14 16:24:09 · 75 阅读 · 0 评论 -
一天一算法(35):顺时针打印矩阵
题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.思路最单纯的思路就是,定义一个枚举来表示上下左右四个方向,再定义一个数组来记录已经遍历过的位置。最后通过while循环和...原创 2019-10-13 14:59:55 · 77 阅读 · 0 评论 -
一天一算法(7):删除有序数组的重复项
题目给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2],函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。你不需要考虑数组中超出新长度后面的元素。示例 2:给定 nu...原创 2019-05-27 17:07:17 · 161 阅读 · 0 评论 -
一天一算法(27):报数
题目报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:1. 12. 113. 214. 12115. 1112211 被读作 “one 1” (“一个一”) , 即 11。11 被读作 “two 1s” (“两个一”), 即 21。21 被读作 “one 2”, “one 1” (“一个二” , “...原创 2019-06-26 14:52:37 · 195 阅读 · 0 评论 -
一天一算法(26):实现 strStr() 函数。
题目给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。示例 1:输入: haystack = “hello”, needle = “ll”输出: 2示例 2:输入: haystack = “aaaaa”, needle = “bba”输出: -1说明:...原创 2019-06-23 16:02:28 · 120 阅读 · 0 评论 -
一天一算法(29):删除链表中的节点
题目请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。现有一个链表 – head = [4,5,1,9],它可以表示为:示例 1:输入: head = [4,5,1,9], node = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.示例 2...原创 2019-07-07 15:38:44 · 66 阅读 · 0 评论 -
一天一算法(28):最长公共前缀
题目编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。示例 1:输入: ["flower","flow","flight"]输出: "fl"示例 2:输入: ["dog","racecar","car"]输出: ""解释: 输入不存在公共前缀。说明:所有输入只包含小写字母 a-z 。代码 public string LongestC...原创 2019-06-28 18:17:11 · 65 阅读 · 0 评论 -
一天一算法(30):输出数组中和为定值的组合
题目把某个数组中,数组项相加为m的组合输出,如数组[1,2,4,5,6],相加为11的组合有[5,6],[1,4,6],[2,4,5]。代码(试例)这个是针对11的using System;using System.Collections.Generic;public class Test{ public static void Main() { int []a=new in...原创 2019-09-17 10:32:56 · 427 阅读 · 0 评论 -
一天一算法(31):反转链表
题目输入一个链表,反转链表后,输出新链表的表头。思路将第二个节点的next指向第一个节点,第三个节点的next指向第二个节点,以此下去,但最后一个节点就是新链表的头节点了。代码 public ListNode ReverseList(ListNode pHead) { // write code here if(pHead==null || pHe...原创 2019-09-26 21:00:45 · 80 阅读 · 0 评论 -
一天一算法(32):合并两个排序的链表
题目输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题单调不减规则,意味着合并后的链表可能存在重复的值,也就是说并不是单调递增的。知道题目后,以我的解法,就是循环取出第二个链表的节点,遍历第一个链表,将取出的节点插入第一个链表的合适位置。代码class Solution{ public ListNode Merge(Lis...原创 2019-09-27 15:58:24 · 101 阅读 · 0 评论 -
一天一算法(33):树的子结构
题目输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)题解先找出A中val等于B树根节点的val的节点。然后以该节点为根节点,与B树进行比较。相同就返回true,否则继续遍历A树,然后重复上述操作。如果A遍历完了都没有匹配到,则为false。代码using System;using System.Collections.Generic;usin...原创 2019-09-28 15:50:38 · 80 阅读 · 0 评论 -
一天一算法(34):求树的镜像
题目操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5题解...原创 2019-10-10 10:42:07 · 133 阅读 · 0 评论 -
一天一算法(25):字符串转换整数 (atoi)
题目请你来实现一个 atoi 函数,使其能将字符串转换成整数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可...原创 2019-06-22 15:54:00 · 97 阅读 · 0 评论 -
一天一算法(19):旋转图像
题目**给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例 1:给定 matrix = [ [1,2,3], [4,5,6], [7,8,9]],原地旋转输入矩阵,使其变为:[ [7,4,1], [8,5,2], [9,6,3]...原创 2019-06-11 16:28:24 · 125 阅读 · 0 评论 -
一天一算法(14):两个数组的交集 II
题目给定两个数组,编写一个函数来计算它们的交集。示例 1:输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2,2]示例 2:输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出: [4,9]说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。我们可以不考虑输出结果的顺序。进阶:如果给定的数...原创 2019-06-05 15:48:17 · 90 阅读 · 0 评论 -
一天一算法(10):旋转数组
题目给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。示例 1:输入: [1,2,3,4,5,6,7] 和 k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5]向右旋转 3 步: [5,6,7,1,2,3,4]示例 2:输入: [-1,-100,3,99] ...原创 2019-05-28 17:12:30 · 98 阅读 · 0 评论 -
一天一算法(9):二分插入排序
原理这个是直接插入排序的改进,首先假设 i 前面的数据已经是有序的了。然后取其中间的数与 a[i]比较,大于a[i]取前半段,否则取后半段,直到找到适合的插入点。代码int left=0, right = 0,mid; long k; for (int i = 1; i < a.Length; i++) { ...原创 2019-05-28 16:10:51 · 77 阅读 · 0 评论 -
一天一算法(1):快速排序
前言我去网上查看了快速排序的代码,千篇一律,代码简直一个模子里面印出来的,这样没意思,用的都是别人的思路。于是我自己动手写了一个,虽然代码不够简洁,但是我觉得排序的目的应该达到了思路快速排序算法无非就是利用左右两个指针,向左或者向右遍历数组,并且与基准点比较,从而达到排序的目的首先:假设我们的无序数列是:5,11,1,2,8,6,9然后声明两个int变量i和j,然后我们让 i 和 j ...原创 2019-05-23 17:49:53 · 141 阅读 · 0 评论 -
一天一算法(8): 买卖股票的最佳时机 II
题目给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易...原创 2019-05-27 17:45:26 · 81 阅读 · 0 评论 -
一天一算法(6):直接插入排序
代码public static void DirectlySort(long []a) { long k,j; for (int i = 1; i <= a.Length - 1; i++) { k = a[i]; for ( j =i; ...原创 2019-05-27 15:34:30 · 116 阅读 · 0 评论 -
一天一算法(5):冒泡排序
代码 public static void Bubbling(long []a) { long k; for (int i = a.Length - 1; i >0; i--) { for (int j = 0;j<i;j++) {...原创 2019-05-27 14:53:55 · 75 阅读 · 0 评论 -
一天一算法(4):选择排序
原理选择排序我觉得是最简单的排序了,无非就是每次遍历都选出最小的数,然后将他们插在第1或2或3…代码 public static void ChooseSort(long []a) { int k; long min; for(int i=0;i<a.Length;i++) ...原创 2019-05-25 16:09:40 · 69 阅读 · 0 评论 -
一天一算法(3):堆排序
原理推荐去看这个教程,讲的很清晰明了堆排序代码这是我通过理解原理后写的代码: public static void HeapSort(long []a,int length) { long k; int nowindex = length / 2 - 1;//找出最后一个非叶子节点,这是一个公式 ...原创 2019-05-25 15:57:14 · 99 阅读 · 0 评论 -
一天一算法(15):数组加一
题目给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例 1:输入: [1,2,3]输出: [1,2,4]解释: 输入数组表示数字 123。示例 2:输入: [4,3,2,1]输出: [4,3,2,2]解释: 输入数组表示数字 4321。解析这...原创 2019-06-05 17:52:43 · 355 阅读 · 0 评论 -
一天一算法(20): 反转字符串
题目编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。示例 1:输入:[“h”,“e”,“l”,“l”,“o”]输出:[“o”,“l”,“l”,“e”,“h”]示例 2:输入:[“...原创 2019-06-12 15:05:23 · 76 阅读 · 0 评论 -
一天一算法(21): 整数反转
题目给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。解题思路这道题应该就是利...原创 2019-06-12 15:29:50 · 103 阅读 · 0 评论 -
一天一算法(13):只出现一次的数字
题目只出现一次的数字给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出: 4解析利用哈希表的话可以很快的解决这道题,但是利用哈希表就违反了“不使用额外空间来实现”这个规...原创 2019-06-04 17:24:08 · 159 阅读 · 0 评论 -
一天一算法(18):有效的数独
题目有效的数独判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。上图是一个部分填充的有效的数独。数独部分空格内已填入了数字,空白格用 ‘.’ 表示。示例 1:输入:[[“5”,“3”,".",".",“7...原创 2019-06-10 16:35:49 · 126 阅读 · 0 评论 -
一天一算法(24): 验证回文字符串
题目给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。示例 1:输入: “A man, a plan, a canal: Panama”输出: true示例 2:输入: “race a car”输出: false难点这道题的难点就在于大小写字母不分,字母与数字组合,所以判断是否是数字或者字母是必不可少...原创 2019-06-15 16:14:10 · 76 阅读 · 0 评论