我的算法练习记录
<pre name="code" class="plain">緒論:算法在計(jì)算機(jī)中基本上是通用的,僅僅只是不同的語言表現(xiàn)的方式有區(qū)別.1.集合類型數(shù)據(jù)用特定字符拼接為一個(gè)字符串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個(gè)元素追加分隔符str += n + sep;else//最后一個(gè)直接加上str += n;}trace(str);上述算法相當(dāng)于數(shù)組的join()方法.API方法有時(shí)候會(huì)有一定局限.2.提取某元素所在組數(shù)據(jù)如果有一個(gè)數(shù)據(jù)集合{n1,n2,n3,n4,n5......},里面的數(shù)據(jù)每N個(gè)為一個(gè)Group.已知集合對(duì)象和當(dāng)中某個(gè)元素的索引i.要求把元素i所在Group的全部元素放在一個(gè)集合中.集合索引一般從0開始.var g:int = int(Math.ceil(i/N)) 對(duì)元素i與N相除,并對(duì)結(jié)果向上取整可得i是第幾組數(shù)據(jù)第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;接下來僅僅須要對(duì)集合對(duì)象依照上述索引遍歷就可以for(var index:int = start;index <= end;index++)//索引的Range是全閉區(qū)間{.......................}3.冒泡排序的奧妙理解以下的代碼要一句句的連貫起來,依照計(jì)算機(jī)執(zhí)行規(guī)律去理解,不能想當(dāng)然.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;} }} 結(jié)果都是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,不是必需進(jìn)循環(huán){s *= n;n --;}return s;}4.斐波那契數(shù)列--遞歸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,下標(biāo)從0開始才對(duì).//這個(gè)數(shù)列僅僅能是自然數(shù).fab(0) = 0,fab(1) = 1是初始的兩個(gè)數(shù),以后的//數(shù)字才符合后面的數(shù)字是前面兩個(gè)數(shù)字的和,至少有兩個(gè)初始數(shù)字.5.尋找質(zhì)數(shù)寫法一: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的數(shù)都不能和其整除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;}紅色部分還能夠?qū)憺?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;}上面採用了一個(gè)素?cái)?shù)定理,詳細(xì)證明不知,只是能夠提高算法效率另一種篩法找質(zhì)數(shù),效率高,但消耗內(nèi)存,也比較復(fù)雜,無論了.以下是找質(zhì)數(shù):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.一個(gè)循環(huán)打印一個(gè)國際象棋棋盤布局(純粹練習(xí)算法玩的)方式一: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();}寫法四:(我認(rèn)為這個(gè)算法已經(jīng)最精簡了,如果你有更精簡的請回復(fù)賜教):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();}改動(dòng)for循環(huán)的長度,我還能夠畫出很多其它格子的類國際象棋棋盤布局寫法五: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); else head = (i % 8 == 0 ? 1 : 0); if (i % 8 == 0) System.out.println(); } 上面的代碼盡管行數(shù)可能比四多點(diǎn),可是,層次更清晰,分工明白,更好維護(hù) 7.隨機(jī)生成1-9位,各位不等的數(shù)字字符串 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++) { //從數(shù)組中隨機(jī)一個(gè)索引 var index:int = Math.random()*arr.length; //將這個(gè)索引相應(yīng)的數(shù)字增加到字符串 str += arr[index]; //刪除相應(yīng)索引的數(shù)字 arr.splice(index,1); } return str; }
總結(jié)
- 上一篇: vagrant 基本命令讲解
- 下一篇: 几种PCB软件