![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
编程之美
文章平均质量分 64
BruceZhang
计算机专业的一个小学生
展开
-
编程之美2.2 不要被阶乘吓倒
开始看到这道题目的时候,我还以为是利用字符串表示整型数的思想,后来一看,由于是一个数的阶乘,那么,如果这个数本身就很大,那么,即使是利用字符串表示也是不合理的,所以,看了下这道题的解释,书中给出了一个公式之后就明白了题目的意思。 首先,我先把函数声明和题目要求贴出来:/*2.2 不要被阶乘吓倒*//*2.2.1 N!的末尾有多少个0*/int DutCountOf0InFactori原创 2014-09-24 14:47:49 · 1638 阅读 · 0 评论 -
编程之美3.3 计算两个字符串的相似度
假如有两个字符串分别是:abcd,bbcd,那么,这两个字符串不相同的字符个数是1,即第一个字符时不相同的,定义字符串的相似度为 1 / (x + 1),其中,x 就是不相同的字符个数。 我们可以有三种方法比较两个字符串中不相同字符的个数: 1.去掉第一个字符串中不相同的那个字符,并同时再去比较下一个字符 2.去掉第二个字符串中不相同的那个字符,并同时再去比较下一个字原创 2014-10-19 15:21:07 · 3196 阅读 · 0 评论 -
编程之美3.2 电话号码对应英语字母
这也是一道很常见的题目,好多类似的题目用的也是同样的解法,这道题目的意思是,我们的手机上的数字键上面对应着英文字母,那么这个数字可能对应3个,也可能对应4个,也有可能对应0个,那么,当我输入一串数字后,需要给出所有这些数字可能对应的英文字母。 说到这里,相信大家也就明白了,这其实就是全排列,只不过我们首先需要给出已知条件,即数字对应着哪些字母,对应着几个字母,因为要做全排列,就一定要知道原创 2014-10-19 12:51:22 · 2561 阅读 · 0 评论 -
编程之美3.1 字符串移位包含问题
这道题目的意思是给定一个字符串,作为源字符串,之后给出其他的字符串,确定源字符串是否能够经过旋转而得到给定的字符串,即移位包含问题。 假如,给定一个字符串 abcdefg,接着给定字符串 cdefgab,很显然,给定的字符串是可以经过源字符串旋转而得到的,但是,给定字符串 cdegfab 就不能由源字符串经过旋转而得到。 当然,这道题有很多解法,我们可以经过判断字符串中字符的位原创 2014-10-17 19:02:28 · 1651 阅读 · 0 评论 -
编程之美2.17 数组循环移位
这是一个很经典的题目,题目的大概意思是这样的: 有一个存储字符串的数组,需要按照要求循环移动数组中的字符,例如,数组中存储字符 abcd1234,循环右移4位,之后,会得到这样一个字符数组 1234abcd,当然,左移也是同样的解法 想想这个问题不是很难,顺序依次移动就可以了,这样做的话,时间复杂度是O(n2)量级的,那么,有没有更快的方法呢? 首先,我们需要对数组的原创 2014-10-16 14:39:18 · 1581 阅读 · 0 评论 -
编程之美2.16 最长递增子序列
这道题目要求返回一个数字,这个数字代表一个数组中最长的递增子序列,当然,不要求这个序列是连续的,比如,有这样一个数组:{1, 3,5,7, 2, 9},那么这个数组的最长递增子序列就是5,即1, 3, 5, 7,9 解决这道题目的思想就是:后面的数字只要是大于前面递增子序列的最大值,那么,它就一定大于前面所有的序列,既然需要知道前面保存的序列,那么,我们这里就需要一个辅助数组,数组原创 2014-10-16 09:54:26 · 2485 阅读 · 0 评论 -
编程之美2.15 二维数组最大子数组的和(数组下标从(1,1)开始)
首先,我们看到这篇文章的题目,我们就会想到之前的那个题目 -- 连续子数组最大和问题。这个问题无疑就是把原问题扩展到二维的情况。 想起来这个问题也不是很难,我们可以求解一维矩阵的思想,即我们可以固定住行(或列),之后,我们去求解列(或行)所构成的最大和就可以了。 这里的解法利用的是固定住行,然后求解需要寻找的列之和,利用书中提到的一个公式: 以左上角的元素(1,1)和当前元素(i,j)为原创 2014-10-15 16:07:57 · 1994 阅读 · 0 评论 -
编程之美2.14 求数组的子数组之和的最大值
这是一个在面试中出现概率很高的一道题目,就拿我来说吧,面试了5家公司中,两家公司问了这道题目,可见,这道题目是非常经典的。 解题思想也不是很难,我熟悉的有;两种解题办法: 1. 一直连加,终止当前序列的条件是连加的和是负数 因为,一个数加上一个负数之后肯定是没有原来的数值大,所以,这肯定是没有意义的,最终,我们利用这个思想得到如下的解法。 函数声明:ll D原创 2014-10-14 14:40:42 · 1698 阅读 · 0 评论 -
编程之美2.13 子数组的最大乘积
这道题目是求 n-1 个数的最大乘积,即数组大小为 n,则会存在 n 个 n-1 的连续数字,那么,我们需要寻找的是最大的那一个乘积。 其实看到题目,感觉很简单,循环走两遍数组就可以得到结果,但是,那样的话,复杂度是平方量级的,如果一个数组中元素很多,那么,时间效率上是不能接受的,所以,需要重新思考问题,寻找简洁的解法。 这里,我们可以利用辅助数组的办法,把需要乘在一起的数字保原创 2014-10-14 09:44:24 · 1981 阅读 · 0 评论 -
编程之美2.12 快速寻找满足条件的两个数
这道题目的意思是,在一个数组中寻找两个数,使这两个数的和等于给定的数(找到任意一组就可以了)。 题目读完之后,感觉这道题目还是很简单的,就是遍历数组呗,走两遍,即可以在O(n2)时间复杂度内解决这个问题。不过,仔细想想之后,复杂度还是可以降低的。 首先,我们可以对数组进行排序,这样,得到的数组就是一个有序数组(假设数组是递增的),那么,我们可以利用两个指针,一个指针指向数组的第原创 2014-10-08 16:33:43 · 1604 阅读 · 3 评论 -
编程之美2.10 寻找数组中的最大值和最小值
这个问题其实很容易解决,就是循环遍历一遍数组,然后找到数组中存在的最大值和最小值就可以了,书中主要讨论的问题是比较次数较小的方法,不过,书中已经证明了,无论用什么方法最少的比较次数也就是循环遍历一遍的比较,结果是O(1.5N)的,所以,很容易的可以解决这个问题。 第一种方法: 函数声明:void DutFindMaxAndMinInArray_1(int*, int, int&原创 2014-10-08 10:09:04 · 2277 阅读 · 2 评论 -
编程之美2.9 斐波那契数列
斐波那契数列是我们在学习C语言的时候,在递归那一章的经典实例,当然,还会有汉诺塔的例子。 这个问题时这样定义的: 0 (x f(x) = 1 (x == 1) f(x - 1) + f(x - 2) (x > 1) 看到这个递推公式后,我们很容易可以写出如下的代码:原创 2014-09-29 15:00:53 · 1988 阅读 · 4 评论 -
编程之美2.8 找符合条件的整数
这个题目是,给定一个整数 N,需要寻找另外一个整数 M,使得 N * M 得到的结果十进制表示中只存在1和0两个数字。首先看到这个题目,第一思想肯定是 使 M = 1,并依此递增 M 的值,直到 N * M 获得想要的效果,但是,如果 N 很大呢,那么计算量也是很大的,所以,我们需要寻求更好的解决办法。 书中提到的解决办法有点复杂,这里我介绍的方法也是非常简单的,就是倒过来思考问题,我们原创 2014-09-28 15:19:34 · 1663 阅读 · 0 评论 -
编程之美2.7 最大公约数,最小公倍数
书中的题目是求两个数的最大公约数,其实这个问题时当我们学习C语言的时候老师就讲过的算法,和教学中的求素数是一个类型的问题。 我们当时学的方法是 “辗转相除法”,即利用公式: f(x, y) = f(y, x % y),直到 x % y == 0,取x就是两个数的最大公约数。 但是书中说道,乘除运算太浪费时间了,所以,我们可以换一种方法去思考这个问题,乘除不能用,就只能是加减了,原创 2014-09-27 14:45:53 · 2513 阅读 · 2 评论 -
编程之美2.5 寻找最大的K个数
在一个数组中寻找最大的K个数,我们首先说一种非常简单的方法,利用快速排序中的分割算法,即我们经常看见的partition。这个函数会返回一个 int 类型的值,这个值代表的是前一半数字和后一半数字的分割点,前一半数字都小于等于后一半数字(递增排序),所以,我们只要找到相对应的分割点,即可以找到最大的K个数,或者最小的K个数,这就是利用线性方法可以完成任务的方法。 首先,给出函数声明:in原创 2014-09-27 12:48:53 · 1854 阅读 · 0 评论 -
编程之美 2.4 1的数目
这道题的意思是,给定一个数n,那么从1到n这n个数中,1出现了几次。这个问题开始看,肯定不容易做,往往都是利用最笨的方法,一个数一个数的找就行了,那么如果n很大,就需要非常多的时间了,书中提供了更好的方法,需要发现数字中存在的相关规律:对于数abcde,c这位出现1的次数分以下情况:1.若c > 1,结论是(ab + 1)* 100; 2.若c == 1,结论是(ab)* 100原创 2014-09-25 16:33:55 · 1990 阅读 · 0 评论 -
编程之美2.3 寻找发帖水王
这道题目由于不容易写测试用例,所以,可以把题目转换为:在一个数组中,有一个数字出现的次数超过了数组大小的一半,这和题目原意是一样的。 这道题目的思想是我们同时去掉数组中两个不一样的数字,那么,数组中原来存在的规律是不变的(仅针对这个题目)。 好吧,还是先给出函数声明:/*2.3 寻找发帖水王*/bool DutVerify(int*, int, int);int DutFi原创 2014-09-25 12:12:44 · 1436 阅读 · 0 评论 -
编程之美2.1 求二进制中1的个数
最近一段的时间,一直在看编程之美之类的算法书籍,总的来说,wozui原创 2014-09-24 12:56:35 · 2400 阅读 · 0 评论 -
编程之美3.7 队列中最大值问题
这道题目的意思是,有一个队列,它里面会存储一些数值,现在,要求你需要在 O(1) 的时间内返回这个队列中最大的那个值。 这道题目的和栈中最大值最小值问题是一样的解法,都是需要一个辅助的东西,对于这道题目,我需要的是一个辅助队列。 由于是需要找到最大值,我的做法是,如果辅助队列为空,那么,当数据入队列的时候就需要同时放入队列和辅助队列中;如果辅助队列不为空,但是入队列的那个元素比原创 2014-10-20 14:50:12 · 1816 阅读 · 1 评论