题目描述
在消消乐游戏冲,有一个长度为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);
}
}