zoukankan      html  css  js  c++  java
  • 我的算法练习

    绪论:算法在计算机中基本上是通用的,只不过不同的语言表现的方式有差别.
                
                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之间.

    
    
    
     
  • 相关阅读:
    Oracle ORA07445 [evaopn3()+384] 错误 分析
    Openfiler iscsiadm: No portals found 解决方法
    Openfiler iscsiadm: No portals found 解决方法
    ORA00600 [kmgs_parameter_update_timeout_1], [27072] ORA27072 解决方法
    Oracle 安装 Error in writing to directory /tmp/OraInstall 错误 说明
    Oracle alert log ALTER SYSTEM SET service_names='','SYS$SYS.KUPC$C_...' SCOPE=MEMORY SID='' 说明
    Oracle latch:library cache 导致 数据库挂起 故障
    ORA600 [4194] 说明
    ORA00600:[32695], [hash aggregation can't be done] 解决方法
    Oracle 10g Rac root.sh Failure at final check of Oracle CRS stack 10 解决方法
  • 原文地址:https://www.cnblogs.com/xuezizhenchengxuyuan/p/5082571.html
Copyright © 2011-2022 走看看