丑数

题目:我们把只包含银子2、3和5的数称作丑数。求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7,习惯上我们把1当作第一个丑数。

解题思路:逐个判断每个整数是不是丑数的解法,直观但不够高效

所谓一个数m是另一个数n的因子,是指n能被m整除,也就是n%m==0。根据丑数的定义,丑数只能被2、3和5整除。也就是说如果一个数能被2整除,我们把它连续除以2;如果能被3整除,就连续除以3;如果能被5整除,就除以连续5.如果最后我们得到的是1,那么这个数是丑数,否则不是。

 

创建数组保存已经找到的丑数,用空间换时间的解法

前面的算法之所以效率低,很大程度上是因为不管一个数是不是丑数,我们对它都要做计算,接下来我们试着找到一种只计算丑数的方法,而不再非丑数的整数上花费时间。根据丑数的定义,丑数应该是另一个丑数乘以2、3或者5的结果(1除外)。因此我们可以创建一个数组,里面的数字是排好序的丑数,每一个丑数都是前面的丑数乘以2、3或者5得到的。

 

第一个只出现一次的字符

题目:在字符串中找出第一个只出现一次的字符。如输入“abaccdef”,则输出‘b’;

解题思路:为了解决这个问题,我们可以定义哈希表的键值(Key)是字符,而值(value)是该字符出现的次数。同时我们还需要从头开始扫面字符串两次。第一次扫描字符串时,每扫描到一个字符就在哈希表的对应项中把次数加1。接下来第二次扫描时,每扫描到一个字符就能从哈希标中得到该字符出现的次数。这样第一个只出现一次的字符就是符合要求的输出。

本题只需要一个简单的哈希表就能满足要求。字符是一个长度为8的数据类型,因此总共有256中可能。于是我们创建一个长度为256的数组,每个字母根据其ASCII码值作为数组的下标对应数组的一个数字,而数组中存储的是每个字符出现的次数。这样,我们就创建了一个大小为256,以字符ASCII码为键值的哈希表

第一次扫描时,在哈希表中更新一个字符出现的次数的时间是O(1).如果字符串长度为n,那么第一次扫描的时间复杂度是O(n)。第二次扫描时,同样O(1)能独处一个字符出现的次数,所以时间复杂度仍然是O(n).这样算起来,总的时间复杂度是O(n)。同时,我们需要一个包含256个字符的辅助数组,它的大小是1K.由于这个数组的大小是一个常数,因此可以认为这种算法的空间复杂度是O(1).

posted @ 2018-06-21 21:09  我们都是大好青年  阅读(199)  评论(0编辑  收藏  举报