zoukankan      html  css  js  c++  java
  • 丑数

    题目:我们把只包含银子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).

  • 相关阅读:
    cocos2dx进阶学习之CCDirector
    cocos2d-x游戏开发系列教程-超级玛丽03-main函数
    磁盘管理
    磁盘同步操作
    导入、导出一个卷组
    创建VG
    IBM磁盘阵列及文件系统的管理
    AIX查看HBA卡的WWN号
    AIX设备四种状态
    AIX 适配器
  • 原文地址:https://www.cnblogs.com/zhibei/p/9210976.html
Copyright © 2011-2022 走看看