我的算法练习记录

来源:互联网 发布:wind 社会责任数据 编辑:程序博客网 时间:2024/06/05 06:27

<pre name="code" class="plain">绪论:算法在计算机中基本上是通用的,只不过不同的语言表现的方式有差别.1.集合类型数据用特定字符拼接为一个字符串var str:String = "";var arr:Array = [1,2,3,5,3,2];var sep:String = ";";for(var i:int = 0;i < arr.length; i++){var n:int = arr[i];if(i < arr.length - 1)//前arr.length - 1个元素追加分隔符str += n + sep;else//最后一个直接加上str += n;}trace(str);上述算法相当于数组的join()方法.API方法有时候会有一定局限.2.提取某元素所在组数据假设有一个数据集合{n1,n2,n3,n4,n5......},里面的数据每N个为一个Group.已知集合对象和其中某个元素的索引i.要求把元素i所在Group的所有元素放在一个集合中.集合索引一般从0开始.var g:int = int(Math.ceil(i/N)) 对元素i与N相除,并对结果向上取整可得i是第几组数据第1组 0 到 N-1第2组 N 到 N+N - 1......第g组 (g-1)*N 到 g*N -1至此可以得到元素i所在组的起始索引var startIndex:int = (g-1)*N;var endIndex:int = g*N - 1;接下来只需要对集合对象按照上述索引遍历即可for(var index:int = start;index <= end;index++)//索引的Range是全闭区间{.......................}3.冒泡排序的奥妙理解下面的代码要一句句的连贯起来,按照计算机运行规律去理解,不能想当然.var arr:Array = [1,3,0,2,4,2];//length = 6写法一:for(var i:int = 0;i < arr.length;i++){for(var j:int = 0;j < arr.length;j++){var t:int = arr[i];if(arr[i] < arr[j])//  > 倒序   ;  < 正序{arr[i] = arr[j];arr[j] = t;} }} 写法二:for(var i:int = 0;i < arr.length;i++){for(var j:int = 0;j < arr.length - 1;j++){var t:int = arr[i];if(arr[i] < arr[j])//  > 倒序   ;  < 正序{arr[i] = arr[j];arr[j] = t;} }}写法三:for(var i:int = 0;i < arr.length - 1;i++){for(var j:int = 0;j < arr.length - 1 - i;j++){var t:int = arr[j + 1];if(arr[j + 1] < arr[j])//  > 倒序   ;  < 正序{arr[j + 1] = arr[j];arr[j] = t;} }} 结果都是arr = [0,1,2,2,3,4]3.阶乘private function factorial(n:int):int{var s:int = 1;while(n > 1)//这里之前写为>0,想想还是不够好,因为0和1的阶乘都是1,没必要进循环{s *= n;n --;}return s;}4.斐波那契数列--递归private function fibonacci(n:int):int{if(n <= 1)return n;elsereturn fibonacci(n-2) + fibonacci(n-1);}//开始我 n <= 1 return 1;这样一来 fab(2) = 2,下标从0开始才对.//这个数列只能是自然数.fab(0) = 0,fab(1) = 1是初始的两个数,以后的//数字才符合后面的数字是前面两个数字的和,至少有两个初始数字.5.寻找质数写法一:private function isPrime(n:int):Boolean{var sum:int = 0;for(var i:int = 2;i <= n-1;i++){if(n % i != 0)sum ++;} //2开始直到比它小1的数都不能和其整除if(sum == n-2)return true;elsereturn false;}写法二:private function isPrime(n:int):Boolean{for(var i:int = 2;i <= n-1;i++)if(n % i == 0)return false;return true;}红色部分还可以写为:1.for(var i:int = 2;i < n;i++)2.for(var i:int = n - 1;i > 1;i--)写法三:private function isPrime(n:int):Boolean{var s:int = int(Math.sqrt(n));for(var i:int = s;i > 1;i--)if(n % i == 0)return false;return true;}上面采用了一个素数定理,具体证明不知,不过可以提高算法效率还有一种筛法找质数,效率高,但消耗内存,也比较复杂,不管了.下面是找质数:private function primes(n:int):Array{var arr:Array = [];for(var i:int = 2;i <= n;i++){if(isPrime(i))arr.push(i);}return arr;}6.一个循环打印一个国际象棋棋盘布局(纯粹练习算法玩的)方式一:int head = 0;for(int i = 1;i <= 64;i++){if(head == 0){if(i % 2 == 0)System.out.print("0");elseSystem.out.print("1");}else{if(i % 2 != 0)System.out.print("0");elseSystem.out.print("1");}if(i % 8 == 0){if(head == 0)head = 1;elsehead = 0;System.out.println();}}方式二:int head = 0;for(int i = 1;i <= 64;i++){if(head == 0){System.out.print("0");if(i % 8 == 0){head = 0;System.out.println();}else head = 1;}else{System.out.print("1");if(i % 8 == 0){head = 1;System.out.println();}else head = 0;}}写法三:int head = 1;for (int i = 1; i <= 64; i++) {if (head == 0) {System.out.print("0");if (i % 8 == 0)head = 0;elsehead = 1;} else {System.out.print("1");if (i % 8 == 0)head = 1;elsehead = 0;}if (i % 8 == 0)System.out.println();}写法四:(我觉得这个算法已经最精简了,如果你有更精简的请回复赐教):int head = 1;for (int i = 1; i <= 64; i++) {if (head == 0) {System.out.print("0");head = (i % 8 == 0 ? 0 : 1);} else{System.out.print("1");head = (i % 8 == 0 ? 1 : 0);}if (i % 8 == 0)System.out.println();}修改for循环的长度,我还可以画出更多格子的类国际象棋棋盘布局写法五:int head = 1;for (int i = 1; i <= 64; i++) {if(head == 0)System.out.print("0");elseSystem.out.print("1"); if (head == 0) head = (i % 8 == 0 ? 0 : 1);elsehead = (i % 8 == 0 ? 1 : 0);if (i % 8 == 0)System.out.println();}上面的代码虽然行数可能比四多点,但是,层次更清晰,分工明确,更好维护7.随机生成1-9位,各位不等的数字字符串private  function randDiffNO(bits:int = 1):String{var str:String = "";var arr:Array = [0,1,2,3,4,5,6,7,8,9];for(var i:int = 0;i < bits;i++){//从数组中随机一个索引var index:int =  Math.random()*arr.length;//将这个索引对应的数字加入到字符串str += arr[index];//删除对应索引的数字arr.splice(index,1);} return str;}


0 0
原创粉丝点击