长度为n的串最小可以被消成长度为多少的串

题目描述

在消消乐游戏冲,有一个长度为n的仅有1~9这9个数字组成的串,如果相邻两个数之和为10,这这两个数可以彼此抵消,在原串中抹去。
例如:串213792,第三个数3和其相邻的第4个数7两者之和为10,因此可以消去;原串变为2192,1和9之和为10,且相邻,则可以消去,最终变为22。
求这个长度为n的串最小可以被消成长度为多少的串。

输入输出描述

第一行为串的长度
第二行为串的值
输出为消去后剩余的串的长度

示例:

6
184629
0

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

分析

在这里插入图片描述

代码还有点粗糙,不过我已经改良几版了,也测试过几个例子都过了,欢迎交流

package nowcoder;
import java.util.Scanner;
import java.util.Arrays;

/**
 * Created by 此生辽阔 on 2021/4/4 20:19
 */

public class fama {
    public static void main(String[] args){

         Scanner sc = new Scanner(System.in);

         String str = sc.nextLine().toString();
         String str2 = sc.nextLine().toString();
          int num=Integer.parseInt(str);

         int[]arr = new int[num];
        for(int i=0;i<num;i++)
        {
            arr[i]=Integer.parseInt(String.valueOf(str2.charAt(i)));
        }
//        for(int i=0;i<num;i++) {
//            System.out.print(arr[i]+" ");
//        }
        int i=0;
        int k=num;//记录当前数组中不为0的元素个数
        while(i<num-1)
        {
           if(i>=0&&i<num-1&&arr[i]!=0)
           {
               int p=i+1;
               while(p<num-1)
               {
                  if(arr[p]==0)//跳过已经被置零的位
                  {
                      p++;
                  }
                  else
                  {
                      break;//找到不为0的arr[p]就跳出while循环
                  }
               }

               if(arr[i]+arr[p]==10)
               {
                   arr[i]=0;
                   arr[p]=0;
                   k= k-2;//当前数组中不为0的元素个数减去2
                   while(i>0)//防止i回退的时候越界
                   {
                       if(arr[i]==0)
                       {
                           i--;//把和为10的消掉之后,把相应位置0,同时回退到前一个不为0的数
                       }
                       else
                       {
                           break;//找到不为0的arr[i]就跳出while循环
                       }
                   }
               }
               else
               {
                  // i=i+1;//不满足arr[i]+arr[p]=10,i向后找
                   i=p;//直接i=p,降低时间复杂度,因为i和p之间都是0
               }
           }
           else
           {
               i++;
           }
        }
        System.out.println(k);
    }
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值