当前位置: 首页 > 图文教程 > Flash动画 > ActionScript > AS3面试题:复杂算法的改进

ActionScript
AS教程:ActionScript优化
AS3教程:密码强度验证
AS3编程心得
AS 3.0未公开的addFrameScript()方法
网页FLASH动画禁止右键菜单的方法
代码最优化实例
AS3实现以二进制方式播放mp3文件
Flex开发的基于浏览器的WEB操作系统
WEBJX收集的AS3非常有用的类库
通过实例学习flash AS3.0:案例二
Flash教程:ActionScript编程基础
Flash as入门(2):面向对象编程基础
Flex的背景和技术特点
参考:AS3及Flex的常用实用问题
Flash AS实例:随机移动动画特效
Flash AS教程:对拖到指定区域小球计数
Flash AS:用Point简单制作虚线特效
Flash的AS3代码制作模糊滤镜动画特效
Flash as入门(6):文本与字符串游戏实例
Flash as入门(7):创建影片剪辑

ActionScript 中的 AS3面试题:复杂算法的改进


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-03-20   浏览: 266 ::
收藏到网摘: n/a

最近在网上看到一个AS3面试题,感兴趣写了个答案,当然标不标准我就不知道了~

题目:
对一批编号为1-100全部开关朝上(开)的灯进行以下操作:
开关编号凡是1的倍数反方向拨一次开关;若该编号也是2的倍数反方向又拨一次开关;若该编号又是3的倍数反方向又拨一次开关……以此类推一直计算到100为止。
目的:请trace出经过反复开关操作后所有关闭的灯的开关编号。

这是我写给大家看的易懂版本:


var n:int, m:int;
var range:int = 100;
for(var i:int = 1; i <= range; i ++){
  n = 1;
  while(true){
    if(n > i / n){
      break;
    }
    if(i % n == 0){
      if(i / n == n){
        trace("结果",i);
        break;
      }
    }
    n ++;
  }
}

下面是写着玩的缩写版本,不过正常写项目代码,我不会这样干的,在这儿只是娱乐一下而已。下面这段代码想玩就看看,不想玩的看上面就行了,判断原理是一样,没区别!

var n:int = 1, range:int = 1000;
for(var i:int = 1; i <= range; i += n = 1){
  while(n > 0) n = n > i / n ? 0 : !(i % n) ? i / n == n ? -1 : n + 1 : n + 1;
  if(n == -1) trace("结果",i);
}

我将range都改成100000后,第一种方法耗时7233毫秒,第二种缩减的写法耗时1840毫秒。对于易读易懂,你会选择那种方法呢?

对于暗泪同学的回复,下面增加一点内容:
其实上面写的是正常算法,如果2亿次,通过分析题目,可以得出只要该数能被开平方时,就是关闭状态,因此这道题目如果是写在项目里面,可以这样写:

var range:int = 1000000000;
var num:int = Math.pow(range,0.5);
for(var i:int = 1; i <= num; i ++){
  trace("结果",i * i)
}

我测试过10亿次的效率,仅需要6毫秒~何其快啊!