鱼C论坛

 找回密码
 立即注册
查看: 81|回复: 6

js问题求助

[复制链接]
发表于 2021-10-10 11:46:52 | 显示全部楼层 |阅读模式
1鱼币

根据arr得到一个newArr。

需求描述:

-数组数据是以2为基数的任意数值,例如,2,4,8,16,32,64,128等。。。。,长度是4

-数组从0号元素开始,相邻两个数两两比较,

若一致则相加的结果放入新数组,继续比较。

如果遇见0则跳过和下一位比较。

如果不一致,将当前值放入新数组,继续比较。

-新数组不够4位,则补0.



示例:

   Arr=>newArr

  [2,2,2,2] => [4,4,0,0]

     [2,0,2,2] => [4,2,0,0]

     [2,4,2,2] => [2,4,4,0]

     [2,4,4,2] => [2,8,2,0]

     [0,2,0,2] => [4,0,0,0]


  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>无标题文档</title>
  6. </head>

  7. <body>
  8.         <script>
  9.         var arr=[2,2,2,2];
  10.         var newarr=[];
  11.         var arrl=[];
  12.         var j=0;
  13.         var s=0;
  14.                 for(var i=0;i<arr.length;i++)
  15.                         {
  16.                                 if(arr[i]==0)
  17.                                         {continue;}
  18.                                 else
  19.                                         {
  20.                                                 arrl[j]=arr[i];
  21.                                                 j++;
  22.                                         }
  23.                         }
  24.                 if(arrl.length<4)
  25.                         {
  26.                                 for(var a=2;a--;a>=0)
  27.                                         arrl.push(0);
  28.                         };
  29.                 console.log(arrl)                
  30.                 for(var k=0 ;k<arrl.length;k++)//222
  31.                         {
  32.                                 for(var l=k+1;l<arrl.length;l++)
  33.                                         {
  34.                                                 if(arrl[k]==arrl[l])
  35.                                                 {
  36.                                                 newarr[s]=arrl[k]+arrl[l];
  37.                                                        
  38.                                                 }
  39.                                                 else
  40.                                                         {
  41.                                                                 newarr[s]=arrl[k];
  42.                                                                 //newarr[s+1]=arrl[l];
  43.                                                                
  44.                                                         }
  45.                                                 k++;l++;s++;
  46.                                                 break;
  47.                                         }
  48.                         }       
  49.                 for(var q=0;q<4;q++)
  50.                         {
  51.                                 if(newarr.length<4)
  52.                                         {
  53.                                                 newarr.push(0);
  54.                                         }
  55.                         }
  56.                 console.log(newarr);
  57. </script>
  58. </body>
  59. </html>
复制代码


这个代码不满足
     [2,4,2,2] => [2,4,4,0]

     [2,4,4,2] => [2,8,2,0]
我实在是改不会了;
越改越迷,
求大哥救救我啊!

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-10-10 13:01:30 | 显示全部楼层
  1. function foo(arr) {
  2.     const s = arr.filter(v => v !== 0).join('')
  3.     return (s.replace(/(.)\1/g, w => w[0] << 1) + "0000").substr(0, 4).split('').map(v => 1 * v)
  4. }

  5. console.log(foo([2, 2, 2, 2]))
  6. console.log(foo([2, 0, 2, 2]))
  7. console.log(foo([2, 4, 2, 2]))
  8. console.log(foo([2, 4, 4, 2]))
  9. console.log(foo([0, 2, 0, 2]))
复制代码


借助正则表达式这个现成的状态机可以直接实现捕获
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-10-10 13:09:09 | 显示全部楼层
kogawananari 发表于 2021-10-10 13:01
借助正则表达式这个现成的状态机可以直接实现捕获

不过有bug  超过了十位数就不行了 你可以改改 思路一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-10-10 13:14:05 | 显示全部楼层
  1. function foo(arr) {
  2.     const s = arr.filter(v => v !== 0).join(',')
  3.     return (s.replace(/(\d+),\1/g, w => w[0] << 1) + ",0,0,0,0").split(',').map(v => 1 * v).slice(0,4)
  4. }

  5. console.log(foo([64, 128, 2, 2]))
复制代码

好了 无bug的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2021-10-10 13:27:59 | 显示全部楼层

看不懂啊,姐姐
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-10-10 13:50:09 | 显示全部楼层

就是先去掉0 然后把一样的合并再补0就行了  应用场景我猜是2048游戏
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2021-10-10 14:16:37 | 显示全部楼层
kogawananari 发表于 2021-10-10 13:50
就是先去掉0 然后把一样的合并再补0就行了  应用场景我猜是2048游戏

姐姐说对了,我写的代码就是先把原来数组里的零去掉,生成一个新的数组arrl然后再比较相加
可是代码还是出现了部分数组实现不了相加
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1

GMT+8, 2021-10-23 03:20

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表