经典算法题
cwl_java
这个作者很懒,什么都没留下…
展开
-
经典算法题-抛石头
1.问题描述Problem Statement问题陈述When a stone is thrown across water, sometimes it will land on the water and bounce rather than falling in right away. Suppose that a stone is thrown a distance of n. On...原创 2020-03-18 16:57:36 · 627 阅读 · 0 评论 -
经典算法题-球和篮子
1.问题描述Problem Statement问题描述????You have several identical balls that you wish to place in several baskets. Each basket has the same maximum capacity. You are given an int baskets, the number of b...原创 2020-03-18 16:55:42 · 1552 阅读 · 4 评论 -
经典算法题-矩阵中查找单词路径数
1.问题描述Problem Statement问题陈述You are given a String[] grid representing a rectangular grid of letters. You are also given a String find, a word you are to find within the grid. The starting point m...原创 2020-03-18 16:51:53 · 902 阅读 · 0 评论 -
经典算法题-画图问题
1.问题描述Problem Statement 250问题陈述A simple line drawing program uses a blank 20 x 20 pixel canvas and a directional cursor that starts at the upper left corner pointing straight down. The upper left ...原创 2020-03-18 14:49:02 · 615 阅读 · 0 评论 -
经典算法题-公交车问题
1.问题描述问题陈述 你有线[] cityMap 表现城市的布局。 城市有区段。 cityMap 的元素表示的区段, 'B' 指出一个位置哪里有一个公共汽车站。 'X'指出你的位置。 其他地方将会是 '.'表示. 用一个整形变量 int walkingDistance, 表示你愿意走路去一个公共汽车站的最大的距离。 距离应该水平地被垂直地加上区段的数字计算如区段的数字。定义公...原创 2020-03-18 14:44:35 · 3074 阅读 · 0 评论 -
经典算法题-磁盘问题
1. 问题描述Problem Statement问题陈述You are given a String disk representing the clusters on a disk. An 'X' represents a used cluster, and a '.' represents an available cluster. You are also given an int ...原创 2020-03-18 14:42:27 · 550 阅读 · 0 评论 -
经典算法题-三张扑克牌
Problem Statement问题陈述You are playing a card game, and in your hand, you are holding several cards. Each card has a suit, 'S', 'H', 'D', or 'C', and a value between 1 and 10, inclusive. You may pla...原创 2020-03-18 14:38:52 · 1212 阅读 · 0 评论 -
C++经典算法题-2(2N+1) 魔方阵
51.Algorithm Gossip: 2(2N+1) 魔方阵说明方阵的维度整体来看是偶数,但是其实是一个奇数乘以一个偶数,例如6X6,其中6=2X3,我们也称这种方阵与单偶数方阵。解法如果您会解奇数魔术方阵,要解这种方阵也就不难理解,首先我们令n=2(2m+1),并将整个方阵看作是数个奇数方阵的组合,如下所示:首先依序将A、B、C、D四个位置,依奇数方阵的规则填入数字,填完之后,方...原创 2020-01-17 17:21:29 · 725 阅读 · 1 评论 -
C++经典算法题-4N魔方阵
50.Algorithm Gossip: 4N魔方阵说明与奇数魔术方阵 相同,在于求各行、各列与各对角线的和相等,而这次方阵的维度是4的倍数。解法先来看看4X4方阵的解法:简单的说,就是一个从左上由1依序开始填,但遇对角线不填,另一个由左上由16开始填,但只填在对角线,再将两个合起来就是解答了;如果N大于2,则以 4X4为单位画对角线:至于对角线的位置该如何判断,有两个公式,有兴趣...原创 2020-01-17 17:18:27 · 719 阅读 · 0 评论 -
C++经典算法题-奇数魔方阵
49.Algorithm Gossip: 奇数魔方阵说明将1到n(为奇数)的数字排列在nxn的方阵上,且各行、各列与各对角线的和必须相同,如下所示:解法填魔术方阵的方法以奇数最为简单,第一个数字放在第一行第一列的正中央,然后向右(左)上填,如果右(左)上已有数字,则向下填,如下图所示:一般程式语言的阵列索引多由0开始,为了计算方便,我们利用索引1到n的部份,而在计算是向右(左)上或向...原创 2020-01-17 17:15:28 · 994 阅读 · 0 评论 -
C++经典算法题-上三角、下三角、对称矩阵
48.Algorithm Gossip: 上三角、下三角、对称矩阵说明上三角矩阵是矩阵在对角线以下的元素均为0,即Aij = 0,i > j,例如:1 2 3 4 50 6 7 8 90 0 10 11 120 0 0 13 140 0 0 0 15下三角矩阵是矩阵在对角线以上的元素均为0,即Aij = 0,i < j,例如:1 0 0 0 02 6 0 0 0...原创 2020-01-17 17:13:07 · 3259 阅读 · 0 评论 -
C++经典算法题-多维矩阵转一维矩阵
47.Algorithm Gossip: 多维矩阵转一维矩阵说明有的时候,为了运算方便或资料储存的空间问题,使用一维阵列会比二维或多维阵列来得方便 , 例如上三角矩阵、下三角矩阵或对角矩阵,使用一维阵列会比使用二维阵列来得节省空间。解法以二维阵列转一维阵列为例,索引值由0开始,在由二维阵列转一维阵列时,我们有两种方式:「以列(Row)为主」或「以行(Column)为主」。由于 C/C+...原创 2020-01-17 17:10:20 · 945 阅读 · 0 评论 -
C++经典算法题-稀疏矩阵
46.Algorithm Gossip: 稀疏矩阵说明如果在矩阵中,多数的元素并没有资料,称此矩阵为稀疏矩阵(sparse matrix), 由于矩阵在程式中常使用二维阵列表示,二维阵列的大小与使用的记忆体空间成正比,如果多数的元素没有资料,则会造成记忆体空间的浪费,为 此,必须设计稀疏矩阵的阵列储存方式,利用较少的记忆体空间储存完整的矩阵资讯。解法在这边所介绍的方法较为简单,阵列只储存矩...原创 2020-01-17 17:08:17 · 3168 阅读 · 0 评论 -
C++经典算法题-费氏搜寻法
45.Algorithm Gossip: 费氏搜寻法说明二分搜寻法每次搜寻时,都会将搜寻区间分为一半,所以其搜寻时间为O(log(2)n),log(2)表示以2为底的log值,这边要介绍的费氏搜寻,其利用费氏数列作为间隔来搜寻下一个数,所以区间收敛的速度更快,搜寻时间为O(logn)。解法费氏搜寻使用费氏数列来决定下一个数的搜寻位置,所以必须先制作费氏数列,这在之前有提过;费氏搜寻会先透过...原创 2020-01-17 17:05:47 · 384 阅读 · 0 评论 -
C++经典算法题-插补搜寻法
44.Algorithm Gossip: 插补搜寻法说明如果却搜寻的资料分布平均的话,可以使用插补(Interpolation)搜寻法来进行搜寻,在搜寻的对象大于500时,插补搜寻法会比 二分搜寻法 来的快速。解法插补搜寻法是以资料分布的近似直线来作比例运算,以求出中间的索引并进行资料比对,如果取出的值小于要寻找的值,则提高下界,如果取出的值大于要寻找的 值,则降低下界,如此不断的减少搜寻...原创 2020-01-17 17:02:13 · 545 阅读 · 0 评论 -
C++经典算法题-二分搜寻法(搜寻原则的代表)
43.Algorithm Gossip: 二分搜寻法(搜寻原则的代表)说明如果搜寻的数列已经有排序,应该尽量利用它们已排序的特性,以减少搜寻比对的次数,这是搜寻的基本原则,二分搜寻法是这个基本原则的代表。解法在二分搜寻法中,从数列的中间开始搜寻,如果这个数小于我们所搜寻的数,由于数列已排序,则该数左边的数一定都小于要搜寻的对象,所以无需浪费时间在左边的数;如果搜寻的数大于所搜寻的对象,则右...原创 2020-01-17 17:00:23 · 420 阅读 · 0 评论 -
C++经典算法题-循序搜寻法(使用卫兵)
42.Algorithm Gossip: 循序搜寻法(使用卫兵)说明搜寻的目的,是在「已排序的资料」中寻找指定的资料,而当中循序搜寻是最基本的搜寻法, 只要从资料开头寻找到最后,看看是否找到资料即可。解法初学者看到循序搜寻,多数都会使用以下的方式来进行搜寻: while(i < MAX) { if(number[i] == k) { print...原创 2020-01-17 16:57:48 · 597 阅读 · 0 评论 -
C++经典算法题-基数排序法
41.Algorithm Gossip: 基数排序法说明在之前所介绍过的排序方法,都是属于「比较性」的排序法,也就是每次排序时 ,都是比较整个键值的大小以进行排序。这边所要介绍的「基数排序法」(radix sort)则是属于「分配式排序」(distribution sort), 基数排序法又称「桶子法」(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的...原创 2020-01-17 16:55:04 · 556 阅读 · 0 评论 -
C++经典算法题-合并排序法
40.Algorithm Gossip: 合并排序法说明之前所介绍的排序法都是在同一个阵列中的排序,考虑今日有两笔或两笔以上的资料,它可能是不同阵列中的资料,或是不同档案中的资料,如何为它们进行排序?解法可以使用合并排序法,合并排序法基本是将两笔已排序的资料合并并进行排序,如果所读入的资料尚未排序,可以先利用其它的排序方式来处理这两笔资料,然后再将排序好的这两笔资料合并。有人问道,如果两...原创 2020-01-17 16:51:55 · 459 阅读 · 0 评论 -
C++经典算法题-快速排序法(二)
38.Algorithm Gossip: 快速排序法(二)说明在快速排序法(一)中,每次将最左边的元素设为轴,而之前曾经说过,快速排序法的加速在于轴的选择,在这个例子中,只将轴设定为中间的元素,依这个元素作基准进行比较, 这可以增加快速排序法的效率。解法在这个例子中,取中间的元素s作比较,同样的先得右找比s大的索引 i,然后找比s小的索引 j,只要两边的索引还没有交会,就交换 i 与 ...原创 2020-01-17 16:45:18 · 342 阅读 · 0 评论 -
C++经典算法题-快速排序法(一)
37.Algorithm Gossip: 快速排序法(一)说明快速排序法(quick sort)是目前所公认最快的排序方法之一(视解题的对象而定),虽然快速排序法在最差状况下可以达O(n2),但是在多数的情况下,快速排序法的效率表现是相当不错的。快速排序法的基本精神是在数列中找出适当的轴心,然后将数列一分为二,分别对左边与右边数列进行排序,而影响快速排序法效率的正是轴心的选择。这边所介绍的...原创 2020-01-17 16:10:54 · 577 阅读 · 0 评论 -
C++经典算法题-排序法 - 改良的选择排序
36.排序法 - 改良的选择排序说明选择排序法的概念简单,每次从未排序部份选一最小值,插入已排序部份的后端,其时间主要花费于在整个未排序部份寻找最小值,如果能让搜寻最小值的方式加 快,选择排序法的速率也就可以加快,Heap排序法让搜寻的路径由树根至最后一个树叶,而不是整个未排序部份,因而称之为改良的选择排序法。解法Heap排序法使用Heap Tree(堆积树),树是一种资料结构,而堆积树是...原创 2020-01-17 16:07:41 · 523 阅读 · 0 评论 -
C++经典算法题-排序法 - 改良的气泡排序
35.Algorithm Gossip: Shaker 排序法 - 改良的气泡排序说明请看看之前介绍过的气泡排序法:for (i = 0; i < MAX - 1 && flag == 1; i++) { flag = 0; for (j = 0; j < MAX - i - 1; j++) { ...原创 2020-01-17 16:01:56 · 460 阅读 · 0 评论 -
C++经典算法题-Shell 排序法 - 改良的插入排序
34.Algorithm Gossip: Shell 排序法 - 改良的插入排序说明插入排序法由未排序的后半部前端取出一个值,插入已排序前半部的适当位置,概念简单但速度不快。排序要加快的基本原则之一,是让后一次的排序进行时,尽量利用前一次排序后的结果,以加快排序的速度,Shell排序法即是基于此一概念来改良插入排序法。解法Shell排序法最初是D.L Shell于1959所提出,假设要排...原创 2020-01-17 15:46:31 · 337 阅读 · 0 评论 -
C++经典算法题-选择、插入、气泡排序
33.Algorithm Gossip: 选择、插入、气泡排序说明选择排序(Selection sort)、插入排序(Insertion sort)与气泡排序(Bubble sort)这三个排序方式是初学排序所必须知道的三个基本排序方式,它们由于速度不快而不实用(平均与最快的时间复杂度都是O(n2)), 然而它们排序的方式确是值得观察与探讨的。解法选择排序将要排序的对象分作两部份,一个是...原创 2020-01-17 15:39:53 · 426 阅读 · 0 评论 -
C++经典算法题-得分排行
32.Algorithm Gossip: 得分排行说明假设有一教师依学生座号输入考试分数,现希望在输入完毕后自动显示学生分数的排行,当然学生的分数可能相同。解法这个问题基本上要解不难,只要使用额外的一个排行阵列走访分数阵列就可以了,直接使用下面的程式片段作说明: for (i = 0; i < count; i++) { juni[i] = 1...原创 2020-01-17 15:31:01 · 773 阅读 · 0 评论 -
C++经典算法题-数字拆解
31.Algorithm Gossip: 数字拆解说明这个题目来自于 数字拆解,我将之改为C语言的版本,并加上说明。题目是这样的:3 = 2+1 = 1+1+1 所以3有三种拆法4 = 3 + 1 = 2 + 2 = 2 + 1 + 1 = 1 + 1 + 1 + 1 共 五 种5 = 4 + 1 = 3 + 2 = 3 + 1 + 1 = 2 + 2 + 1 = 2 + 1 + 1 +...原创 2020-01-17 15:23:35 · 1203 阅读 · 0 评论 -
C++经典算法题-m 元素集合的n 个元素子集
30.Algorithm Gossip: m 元素集合的n 个元素子集说明假设有个集合拥有m个元素,任意的从集合中取出n个元素,则这n个元素所形成的可能子集有那些?解法假设有5个元素的集点,取出3个元素的可能子集如下:{1 2 3}、{1 2 4 }、{1 2 5}、{1 3 4}、{1 3 5}、{1 4 5}、{2 3 4}、{2 3 5}、{2 4 5}、{3 4 5}这些子...原创 2020-01-17 15:18:30 · 1096 阅读 · 0 评论 -
C++经典算法题-产生可能的集合
29.Algorithm Gossip: 产生可能的集合说明给定一组数字或符号,产生所有可能的集合(包括空集合), 例如给定1 2 3,则可能的集合为:{}、{1}、{1,2}、{1,2,3}、{1,3}、{2}、{2,3}、{3}。解法如果不考虑字典顺序,则有个简单的方法可以产生所有的集合,思考二进位数字加法,并注意1出现的位置,如果每个位置都对应一个数字,则由1所对应的数字所产生的...原创 2020-01-17 15:16:32 · 769 阅读 · 0 评论 -
C++经典算法题-格雷码(Gray Code)
28.Algorithm Gossip: 格雷码(Gray Code)说明Gray Code是一个数列集合,每个数使用二进位来表示,假设使用n位元来表示每个数好了,任两个数之间只有一个位元值不同,例如以下为3位元的Gray Code:000 001 011 010 110 111 101 100由定义可以知道,Gray Code的顺序并不是唯一的,例如将上面的数列反过来写,也是一组Gra...原创 2020-01-17 14:59:22 · 2073 阅读 · 0 评论 -
C++经典算法题-排列组合
27.Algorithm Gossip: 排列组合说明将一组数字、字母或符号进行排列,以得到不同的组合顺序,例如1 2 3这三个数的排列组合有:1 2 3、1 3 2、2 1 3、2 3 1、3 1 2、3 2 1。解法可以使用递回将问题切割为较小的单元进行排列组合,例如1 2 3 4的排列可以分为1 [2 3 4]、2 [1 3 4]、3 [1 2 4]、4 [1 2 3]进行...原创 2020-01-17 14:56:30 · 1251 阅读 · 0 评论 -
C++经典算法题-约瑟夫问题
26.Algorithm Gossip: 约瑟夫问题(Josephus Problem)说明据说着名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人到,于是决定了 一个自杀方式,41个人排成一个圆圈,由第1个人 开始报数,每报数到第3人该人就必须自杀, 然后再由下一个重新报数,直...原创 2020-01-17 14:42:07 · 683 阅读 · 0 评论 -
C++经典算法题-赌博游戏
25.Algorithm Gossip: Craps 赌博游戏说明一个简单的赌博游戏,游戏规则如下:玩家掷两个骰子,点数为1到6,如果第一次点数和为7或11,则玩家胜,如果点数和为2、3或12,则玩家输,如果和 为其它点数,则记录第一次的点数和,然后继续掷骰,直至点数和等于第一次掷出的点数和,则玩家胜,如果在这之前掷出了点数和为7,则玩家输。解法规则看来有些复杂,但是其实只要使用switc...原创 2020-01-17 14:38:26 · 1459 阅读 · 0 评论 -
C++经典算法题-洗扑克牌(乱数排列)
24.Algorithm Gossip: 洗扑克牌(乱数排列)说明洗扑克牌的原理其实与乱数排列是相同的,都是将一组数字(例如1~N)打乱重新排列,只不过洗扑克牌多了一个花色判断的动作而已。解法初学者通常会直接想到,随机产生1~N的乱数并将之存入阵列中,后来产生的乱数存入阵列前必须先检查阵列中是否已有重复的数字,如果有这个数就不存入,再重新产生下一个数,运气不好的话,重复的次数就会很多,程式...原创 2020-01-17 14:34:45 · 1348 阅读 · 0 评论 -
C++经典算法题-后序式的运算
23.Algorithm Gossip: 后序式的运算说明将中序式转换为后序式的好处是,不用处理运算子先后顺序问题,只要依序由运算式由前往后读取即可。解法运算时由后序式的前方开 堆叠始读取,遇到运算元先存入堆叠,如果遇到运算子,则由堆叠中取出两个运算元进行对应的运算,然后将结果存回堆叠,如果运算式读取完 毕,那么堆叠顶的值就是答案了, 例如我们计算12+34+这个运算式(也就是(1+2)*...原创 2020-01-17 14:32:08 · 374 阅读 · 0 评论 -
C++经典算法题-中序式转后序式(前序式)
22.Algorithm Gossip: 中序式转后序式(前序式)说明平常所使用的运算式,主要是将运算元放在运算子的两旁,例如a+b/d这样的式子,这称之为中序(Infix)表示式,对于人类来说,这样的式子很容易理 解,但由于电脑执行指令时是有顺序的,遇到中序表示式时,无法直接进行运算,而必须进一步判断运算的先后顺序,所以必须将中序表示式转换为另一种表示方法。可以将中序表示式转换为后序(P...原创 2020-01-17 14:27:24 · 1211 阅读 · 0 评论 -
C++经典算法题-最大访客数
21.Algorithm Gossip: 最大访客数说明现将举行一个餐会,让访客事先填写到达时间与离开时间,为了掌握座位的数目,必须先估计不同时间的最大访客数。解法这个题目看似有些复杂,其实相当简单,单就计算访客数这个目的,同时考虑同一访客的来访时间与离开时间,反而会使程式变得复杂;只要将来访时间与离开时间分开处理就可以了,假设访客 i 的来访时间为x[i],而离开时间为y[i]。在资料...原创 2020-01-17 14:23:21 · 1032 阅读 · 0 评论 -
C++经典算法题-阿姆斯壮数
20.Algorithm Gossip: 阿姆斯壮数说明在三位的整数中,例如153可以满足13 + 53 + 33 = 153,这样的数称之为Armstrong数,试写出一程式找出所有的三位数Armstrong数。解法Armstrong数的寻找,其实就是在问如何将一个数字分解为个位数、十位数、百位数 ,这只要使用除法与余数运算就可以了,例如输入 input为abc,则:a = inpu...原创 2020-01-17 14:21:25 · 738 阅读 · 0 评论 -
C++经典算法题-完美数
19.Algorithm Gossip: 完美数说明如果有一数n,其真因数(Proper factor)的总和等于n,则称之为完美数(Perfect Number), 例如以下几个数都是完美数:6 = 1 + 2 + 328 = 1 + 2 + 4 + 7 + 14496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248程式基本上不难,第一眼看到时会...原创 2020-01-17 14:19:37 · 3145 阅读 · 0 评论 -
C++经典算法题-最大公因数、最小公倍数、因式分解
18.Algorithm Gossip: 最大公因数、最小公倍数、因式分解说明最大公因数使用辗转相除法来求,最小公倍数则由这个公式来求:GCD * LCM = 两数乘积解法最大公因数可以使用递回与非递回求解,因式分解基本上就是使用小于输入数的数值当作除数,去除以输入数值,如果可以整除就视为因数,要比较快的解法就是求出小于该数的所有质数,并试试看是不是可以整除,求质数的问题是另一个课题,请参...原创 2020-01-17 14:17:32 · 1127 阅读 · 0 评论