求解两道算法题

http://bbs.9ria.com/viewthread.php?tid=81351&extra=page%3D2%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000

 
1、有数组[3,7,9,1,4,2,8] 数字无顺序,不重复,要找出其中连续自然数得最大集合的大小,比如这个数组的最大集合为[1,2,3,4],大小为4。用程序实现上述功能。

2、有两个字符串数组,判断两个数组在不考虑顺序的情况下是否相等,数组中的元素有可能重复,比如["bbb","aaa","ddd","aaa"]和["aaa","ddd","aaa","bbb"]相等
      ["bbb","aaa","ddd"]和["bbb","aaa"]不相等。实现上述功能。
 
 
 
var arr=[1,8,9,2,3];
arr.sort(Array.NUM)
var tempArr=[];
var tempArr2=[];
for(var i=0;i<arr.length;i++){
       var v=arr[i];
       if(tempArr.length==0){tempArr.push(v)}
       else if(tempArr[tempArr.length-1]+1=v){tempArr.push(v)}
      else if(tempArr2.length<tempArr.length){tempArr2=tempArr;tempArr=[]}
     else{tempArr=[]}
}
trace(tempArr2)
}
 
 
 
 
var arr1=["bbb","aaa","ddd","aaa"];
var arr2=["bbb","aaa","ddd","aaa"];
arr1.sort();
arr2.sort();
if(arr1.length!=arr2.length){retrun false}
else{
      for(var i=0;i<arr1.length;i++){if(arr1[i]!=arr2[i])retrun false}
}
retrun true
 
 
 
抛开两处语法错误以外,这个算法也是错的,假设是连续数组[1,2,3,4,5,6], 就不会执行到这条else if (tempArr2.length<tempArr.length),而是会执行这条判断else if (tempArr[tempArr.length-1]+1==v),tempArr2永远是空;还有断节的时候,把tempArr置空后应该把这个断节的数存进去

稍微改了下,不知道有没有BUG
  1. var array:Array = [1,2,3,4,5,6,11,12,13,21,22,23,24,25,26,27];
  2. trace(test(array))

  3. function test(arr:Array):int{
  4.         arr.sort(Array.NUMERIC);
  5.         var arr1:Array = [];
  6.         var arr2:Array = [];
  7.         for(var i:int = 0; i < arr.length; i++){
  8.                 var v:int = arr[i];
  9.                 if(arr1.length == 0) {
  10.                         arr1.push(v);
  11.                 }
  12.                 else if(arr1[arr1.length - 1] + 1 == v) {
  13.                         arr1.push(v);
  14.                         
  15.                         // 如果是连续数组,则直接返回他的长度
  16.                         // 如果已经检测到了最后个数字,则判断临时数组arr1和之前存放的数组arr2的长度大小
  17.                         if(arr1.length == arr.length || (i == arr.length - 1 && arr1.length > arr2.length)){
  18.                                 return arr1.length;
  19.                         }
  20.                 }
  21.                 else if(arr2.length < arr1.length){
  22.                         arr2 = arr1;
  23.                         arr1 = [];
  24.                         arr1.push(v);  // 记得要把断节的数存进去
  25.                 }else{
  26.                         arr1 = [];
  27.                         arr1.push(v);  // 记得要把断节的数存进去
  28.                 }
  29.         }
  30.         return arr2.length;
  31. }
复制代码
 
 
 
 
 
//1
  1. var list:Array = [3,7,9,1,4,2,8];

  2. function getMaxLen(arr:Array):int{
  3.         
  4.         arr.sort(16)

  5.         var map:Object = {}

  6.         var tmp:Array = [];

  7.         var max:int =0;

  8.         for each(var num in arr){

  9.         
  10.                 if(tmp.length>0){
  11.                 
  12.                         if(num-tmp[tmp.length-1]==1){
  13.                         
  14.                                 tmp.push(num)
  15.                         
  16.                                 if(tmp.length>max) map[max = tmp.length] = tmp.slice(0);
  17.                         }else{
  18.                         
  19.                                 tmp=[num];
  20.                         }
  21.                 
  22.                 }else{

  23.                         map[++max] = (tmp=[num]).slice(0)
  24.                 }
  25.         }
  26.         return max;

  27. }

  28. trace(getMaxLen(list))
复制代码
//2
  1. var arr1:Array =["bbb","aaa","ddd","aaa"];
  2. var arr2:Array =["aaa","ddd","aaa","bbb"];

  3. function equal(a:Array,b:Array):Boolean{
  4.         a.sort();
  5.         b.sort();
  6.         return a.join("|") == b.join("|")
  7.         
  8. }

  9. trace(equal(arr1,arr2))
复制代码
 
 
 
 
第一题
最好不要在中途 push,直接取出l1,l2,最后slice得到数组为好

第二题
我先想的
排序后
arr1.toString()==arr2.toString()

不过还是用sliz的为好,免得合并后的数组一样但是元素不一样,如

"a","b","c"
"a","bc"

楼上的join同样会有这样的问题

或者可以用
ba1=new ByteArray()
ba1.writeObject(arr1)
ba2=new ByteArray()
ba2.writeObject(arr2)
return ba1.toString()==ba2.toString()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值