算法
曹世宏的博客
这个博客主要记录我平常学习的一些网络,编程,与计算机有关的一些资料,笔记以及心得体会等。
记录博客,一是为了系统的整理一个大知识块,梳理结构知识点,加深记忆。同时,也把学过的一些东西记录下来发,方便以后用到的时候随时查询。另一个也是希望能对有需要的人有点帮助。共同交流学习。
字节跳动内推链接:https://job.toutiao.com/s/JFToRSu
字节跳动校招内推码: YYG5KEY
投递链接: https://job.toutiao.com/s/Jy8BSv6
展开
-
深度优先遍历和广度优先遍历
深度优先遍历深度优先遍历(Depth-First Traversal)简称DFS。算法思想:首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点;当没有未访问过的顶点时,则回到上一个顶点,继续试探别的顶点,直到所有的顶点都被访问过。图:深度优先遍历示例图如上图,采用图的深度优先遍历的话,从0号节点遍历的顺序应该是:0,1,2,3,4.程序源代码...原创 2018-05-14 23:56:15 · 2549 阅读 · 0 评论 -
递归与循环
递归与循环:理论上,任何循环都可以重写为递归形式。有时候,为栈限制,需要“尾递归”。java不支持尾递归。有些语言没有循环语句,只能使用递归。循环改递归:改为递归的关键是发现逻辑的“相似性”。不要忘记递归的“出口”。构造相似性:如果没有明显的相似性,需要主动构造。不能相似的原因很可能是缺少参数。递归与数学上的递推公式类似。递归调用:递归调用紧紧是被函数恰为的函数...原创 2019-01-02 17:57:07 · 4971 阅读 · 7 评论 -
多维数组和矩阵程序练习
顺时针打印二维数组:题目:顺时针打印二维数组。例如:将如下数组:{{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思路:可以先一圈一圈的打印。先打印外圈,再缩小边界范围循环打印内圈即可。打印的时候注意控制边界。代码...原创 2019-01-07 16:12:35 · 707 阅读 · 0 评论 -
快速排序优化及扫描分区法
快速排序扫描分区法:通过单向扫描,双向扫描,以及三指针分区分别实现快速排序算法。着重体现分区的思想。一遍单向扫描法:思路:一遍扫描法的思路是,用两个指针将数组划分为三个区间,扫描指针(scan_pos)左边是确认小于等于主元的,扫描指针到某个指针(next_bigger_pos)中间为未知的,因此我们将第二个指针(next_bigger_pos)成为位未知区间末指针,末指针的右边区间为...原创 2019-01-07 16:13:55 · 812 阅读 · 0 评论 -
常见排序算法2
冒泡排序,插入排序,选择排序,快速排序,希尔排序,归并排序等可参考: 排序算法(1)快速排序优化及分区扫描法:该篇文章主要记录了堆排序,计数排序,桶排序,基数排序等。堆排序堆排序的概念:堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。(百度百科)...原创 2019-03-01 16:15:50 · 289 阅读 · 4 评论 -
10种排序算法的对比分析
10种排序算法对比分析冒泡排序:效率太低,通过冒泡可以掌握swap。选择排序:效率较低,但经常使用它内部的循环方式来找最大值和最小值。插入排序:虽然平均效率低,但在序列基本有序时,它很快,所以也有其适用范围。希尔排序:是插入排序的改良,对空间思维训练有帮助。快速排序:快排是软件工业中最常见的常规排序法,其双向指针扫描和分区算法是核心。往往用于解决类似问题,特别地partiti...原创 2019-03-01 16:16:37 · 2245 阅读 · 1 评论 -
排序算法案例
题目:调整数组顺序使奇数位于偶数前面输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前班部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。解题思想:方案1: 归并排序的思想。利用辅助空间进行排序,判断每个数,如果是奇数放入数组的左边,如果是偶数从右边开始放。方案2:快速排序的思想。不需要辅助空间,利用两个指针,从最左边和最右边的数判断,如果左指针指向的数为偶...原创 2019-03-01 16:17:10 · 1386 阅读 · 0 评论 -
字符串专题算法练习
题目:判断字符串有无重复字符判断一个字符串中是否有重复的字符。假设都是ASCII字符。java代码示例:public class 串内有无重复字符串 { public static void main(String[] args) { String s1 = "abcdsefg"; String s2 = "adfasfad"; System.out.println(ch...原创 2019-03-14 11:07:02 · 719 阅读 · 0 评论 -
算法练习之数学问题
题目:巧用进制,天平称重用天平称重时,我们希望用尽可能少的砝码组和出尽可能多的重量。如果有无限个砝码,但他们的重量分别是1,3,9,27,81,······等3的指数幂。神奇之处在于用他们的组和可以称出任意整数重量(砝码允许放在左右两个盘子中)。本题目要求编程实现:对用户给定的重量,给出砝码组和方案,重量<100000.例如:用户输如:5程序输出: 9 -3-1解题思路:利...原创 2019-03-14 11:08:08 · 533 阅读 · 0 评论 -
DFS例题
深度优先遍历和广度优先遍历:可参考深度优先遍历和广度优先遍历数独游戏:你一定听说过“数独”游戏。如下图所示,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。数独的答案都是唯一的,所以,多个解也称为无解。本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕...原创 2019-03-18 23:06:12 · 2707 阅读 · 0 评论 -
贪心策略算法例题
贪心算法简介:贪心算法硬币支付问题:有1元,5元,10元,50元,100元,500元的硬币各c1,c5,c10,c50,c100,c500枚.现在要用这些硬币来支付A元,最少需要多少枚硬币?假定本题至少存在一种支付方案.0≤ci≤10^90≤A≤10^9输入:第一行有六个数字,分别代表从小到大6种面值的硬币的个数第二行为A,代表需支付的A元样例:输入3 2 1 3...原创 2019-03-30 22:12:10 · 975 阅读 · 0 评论 -
动态规划例题
动态规划算法简介:动态规划算法背包问题:有n个重量和价值分别为wi,vi的物品,从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。1≤n≤1001≤wi,vi≤1001≤W≤10000输入:n=4(w,v)={(2,3),(1,2),(3,4),(2,2)}W=5输出:7(选择第0,1,3号物品)因为对每个物品只有选和不选两种情况,所以这...原创 2019-03-30 22:13:20 · 636 阅读 · 0 评论 -
递归算法
递归算法 在函数或子过程的内部,直接或者间接地调用自己的算法。特点:(1) 递归就是在过程或函数里调用自身。(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。(4) 在 递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成 栈原创 2017-08-25 13:12:38 · 763 阅读 · 2 评论 -
位运算的奇巧淫技
位运算简介位运算简介: 程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。位运算的特点:...原创 2019-01-01 18:07:58 · 1895 阅读 · 0 评论 -
二叉树的基本操作
二叉树:二叉树是树的特殊一种,具有如下特点:1、每个结点最多有两颗子树,结点的度最大为2。2、左子树和右子树是有顺序的,次序不能颠倒。3、即使某结点只有一个子树,也要区分左右子树。满二叉树:在一棵二叉树中,如果所有分支结点都有左孩子和右孩子结点,并且叶子结点都集中在二叉树的最下层,这样的树叫做满二叉树完全二叉树:若二叉树中最多只有最下面两层的结点的度数可以小于2,并且最...原创 2018-05-15 00:00:19 · 2941 阅读 · 0 评论 -
一元多项式的表示及相加
一元多项式的表示及相加设计目的与要求题目与设计要求我们设计的程序为一元多项式的表示及相加,这是使用C++语言写成。我们使用计算机处理的对象之间通常存在着的是一种最简单的线性关系,这类数学模型可称为线性的数据结构。而数据存储结构有两种:顺序存储结构和链式存储结构。线性表是最常用且最简单的一种数据结构。所以我们做的是———–一元多项式的表示及相加,其过程其实是对线性标的操作。实验结...原创 2018-05-15 00:02:43 · 42173 阅读 · 7 评论 -
蓝桥杯程序练习
数列排序 问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200 输入格式 第一行为一个整数n。 第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。 输出格式 输出一行,按从小到大的顺序输出排序后的数列。 样例输入 5 8 3 6 4 ...原创 2018-06-18 23:01:01 · 560 阅读 · 0 评论 -
2018年蓝桥杯省赛Java-B组
1.购物单:题目:小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。 小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定。 现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。 取款机...原创 2018-06-18 23:01:42 · 1467 阅读 · 0 评论 -
2019年蓝桥杯省赛Java-B组
第一题:第几天2000年的1月1日,是那一年的第1天。 那么,2000年的5月4日,是那一年的第几天?注意:需要提交的是一个整数,不要填写任何多余内容。日期类题目解题方法如下:解法1:2000年是闰年二月有29天,一月和三月有31天,四月有30天,所以:31+29+31+30+4=125**解法2:**在考场可以拿电脑自带日期计算器:**解法3:**利用vbs脚本:新建...原创 2018-12-12 22:25:22 · 1195 阅读 · 0 评论 -
常见排序算法
冒泡排序冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。冒泡排序算法的运作如下:比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作...原创 2018-12-12 22:29:26 · 274 阅读 · 0 评论 -
枚举算法
枚举算法的基本思想枚举算法是我们在日常中使用到的最多的一个算法,它的核心思想就是:枚举所有的可能。枚举法的本质就是从所有候选答案中去搜索正确的解,使用该算法需要满足两个条件:(1)可预先确定候选答案的数量;(2)候选答案的范围在求解之前必须有一个确定的集合。枚举结构:循环+判断语句。枚举法的优缺点枚举算法的优点:由于枚举算法一般是现实生活中问题的“直译”,因此比较直观,易于理解;...原创 2018-12-12 22:30:22 · 10133 阅读 · 0 评论 -
分治法
分治法的基本概念:在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规...原创 2018-12-12 22:30:52 · 346 阅读 · 0 评论 -
动态规划算法
基本概念:动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。基本思想与策略:基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最...原创 2018-12-12 22:31:41 · 688 阅读 · 0 评论 -
贪心算法
基本概念:所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。 所以对所采用的贪...原创 2018-12-12 22:32:16 · 348 阅读 · 0 评论 -
回溯算法
基本概念:回溯算法(back tracking)实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 ...原创 2018-12-12 22:32:45 · 350 阅读 · 0 评论 -
2019年蓝桥杯省赛Java-B组
1.组队:作为篮球队教练,你需要从以下名单中选出1 号位至5 号位各一名球员,组成球队的首发阵容。每位球员担任1 号位至5 号位时的评分如下表所示。请你计算首发阵容1号位至5 号位的评分之和最大可能是多少?这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。解题思路:该题很简单。仔细找找就出来了。先找...原创 2019-03-28 12:14:30 · 20419 阅读 · 20 评论