我的算法练习

绪论:算法在计算机中基本上是通用的,只不过不同的语言表现的方式有差别.
            
            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;
                else
                    return fibonacci(n-2) + fibonacci(n-1);
            }
            //开始我 n <= 1 return 1;这样一来 fab(2) = 2,下标从0开始才对.
            //这个数列只能是自然数.fab(0) = 0,fab(1) = 1是初始的两个数,以后的
            //数字才符合后面的数字是前面两个数字的和,至少有两个初始数字.
            
            5.寻找 小于n的最大质数
            写法一:
            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;
                else
                    return 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;
            }

       寻找第n个质数:
        
            private function primes(n:int):int
            {
                var x:int = 2;
                var sum:int = 0;
                var number:int = 2;
                while(sum < n)
                {
                    if(isPrime(x))
                    {
                        sum ++;
                        number = x;
                    }
                    x++;
                }
                
                return number;
            }
            


6.一个循环打印一个国际象棋棋盘布局(纯粹练习算法玩的)
            方式一:
            int head = 0;
            for(int i = 1;i <= 64;i++)
            {
                if(head == 0)
                {
                    if(i % 2 == 0)
                        System.out.print("0");
                    else
                        System.out.print("1");
                }
                else
                {
                    if(i % 2 != 0)
                        System.out.print("0");
                    else
                        System.out.print("1");
                }
                
                
                if(i % 8 == 0)
                {
                    if(head == 0)
                        head = 1;
                    else
                        head = 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;
                    else
                        head = 1;
                } else {
                    System.out.print("1");
                    if (i % 8 == 0)
                        head = 1;
                    else
                        head = 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");
                else
                    System.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();
            }
            上面的代码虽然行数可能比四多点,但是,层次更清晰,分工明确,更好维护
            
            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;
            }

       8.一一对应判断
      
                   for(var n:int = 1;n < sheet.length;n++)
				{
					var cells:Array = sheet[n];
					var v:String = join(column_labels,headerDic,cells);//1,11111
					var firstkey:String = v.substring(0,v.indexOf(","));
					var subkey:String =  v.substring(v.indexOf(",")+1,v.length);
					
					var cz:String = "";
					
					if(dic[firstkey] == null)
					{
						for (var key:String in dic){
                                 //这个判断是根据实际的数据可能情况判断的 if(key != firstkey && dic[key] == subkey) { line = ldic[key]; problemList.addItem({ line:(n+1), column:column_labels, description:"与第" +line+ "行,违反规则:" + desc }); } } dic[firstkey] = subkey; ldic[firstkey] = n+1; } else { if(dic[firstkey] != subkey) { line = ldic[firstkey]; problemList.addItem({ line:(n+1), column:column_labels, description:"与第" +line+ "行,违反规则:" + desc }); } } }

            9.用字典做统计(到目前为止字典都是和循环结合使用的,可以对集合或数组进行元素查重,组合对应判断,和统计)

                   var arr:Array = [{index:1,name:"lishi"},{index:1,name:"zhangsan"},{index:2,name:'wangba'}];
				var dic:Dictionary = new Dictionary;
				for (var j:int = 0; j < arr.length; j++)
				{
					var item:Object = arr[j];
					var index:int = int(item["index"]);
					
					if(dic[index] == null)
					{
						var box:ArrayCollection = new ArrayCollection;
						box.addItem(item);
						dic[index] = box;
					}
					else
						(dic[index] as ArrayCollection).addItem(item);
				}

  

                10.生成指定范围内的随机数(闭区间)

          function rand(start:Number,end:Number):Number
          {
            return Math.round(Math.random()*(end-start))+start
          }

          其中0 =< Math.random() <1,产生的是伪随机数(小数点后16位).   start  =< (end-start)*[0,1) + start < end

          比如我要3-10之间的随机数. 3 =< 7*[0,1) + 3  <    10,这里最大并没有等于10,关键就在于round函数,对

          结果进行了四舍五入,产生的随机数可以很接近7,必然大于6.5,这个时候对结果进行四舍五入,最大值将是10.这样就保证了最终的随机数

          在3到10之间.



 
原文地址:https://www.cnblogs.com/xuezizhenchengxuyuan/p/5082571.html