20210404腾讯笔试题提问

2021年4月4日腾讯后台笔试中出现了一道消消乐风格的算法问题。题目要求消除相邻和为10的数字对,求解经过消法后字符串的最短长度。对于给定的输入案例,虽然能通过大部分测试用例,但在某些情况下无法得到理想结果。本文寻求对这个问题的解决方案,主要思路是利用栈的数据结构来实现。

20210404腾讯后台笔试题提问

结果:只能通过78.57%的case,但是测试案例和自己挑选的测试案例都能过,请求大神解答?
题目描述:消消乐游戏,有—个长度为n的仅有1-9这9个数字组成的串。如果相邻两个数之和为10、这这两个数可以彼此抵消,在原串中抹去.例:串213792,第三个数3和其相邻的第4个数7两者之和秘10,因此可以消法;原串2192,1和9之和为10,且相邻,则可以消去,最终变为22。
求这个长度为n的串最小可以被消成长度为多少的串
输入描述:
第一行输入一个整数n(1=n<= le6), 代表串的长度。
接下来输入一个长度为n的仅有1~9组成的数字串。
输出描述:
输出这个长度为 n的串最小可以被消成长度为多少的串。

案例1:
输入:
6
213792
输出:
2

案例2:
输入:
7
2134314
输出:
7

案例3:
输入:
6
146937
输出:
0

思路:利用栈后入先出实现

import java.util.Scanner;
import java.util.Stack;

public class Test {
    Scanner sc = new Scanner(System.in);
    public static void main(String[] args) {
        Main m = new Main();
        int strLength = m.sc.nextInt();
        String str = m.sc.next();
        int[] nums = new int[strLength];
        Stack<Integer> s = new Stack<>();
        for(int i = 0; i < strLength; i++)
        {
            char c = str.charAt(i);
            char[] charArray = {c};
            nums[i] = Integer.parseInt(new String(charArray));
        }
        for(int num : nums)
        {
            boolean flag = false;
            while( !s.empty() && ((s.peek().intValue()+ num) == 10))
            {
                s.pop();
                flag = true;
            }
            if(!flag)
                s.push(num);
        }
        System.out.println(s.size());
        return;

    }
}
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值