zoukankan      html  css  js  c++  java
  • 华为上机:Tom的生日礼物

    Tom的生日礼物
    描述:

    四月一日快到了,Tom想了个愚人的好办法——送礼物。嘿嘿,不要想的太好,这礼物可没那么简单,Tom为了愚人,准备了一堆盒子,其中有一个盒子里面装了礼物。盒子里面可以再放零个或者多个盒子。假设放礼物的盒子里不再放其他盒子。

    用()表示一个盒子,A表示礼物,Tom想让你帮她算出愚人指数,即最少需要拆多少个盒子才能拿到礼物。

     

    运行时间限制: 无限制
    内存限制: 无限制
    输入:

    本题目包含多组测试,请处理到文件结束。
    每组测试包含一个长度不大于1000,只包含'(',')'和'A'三种字符的字符串,代表Tom设计的礼物透视图。
    你可以假设,每个透视图画的都是合法的。

    输出:

    对于每组测试,请在一行里面输出愚人指数。

    样例输入:
    ((((A)()))())
    (A)
    样例输出:
    4
    1
    答案提示:

     

    解题

    左右分别考虑

    左边开始拆的时候:遇到(一次拆盒子,)说明这次拆盒子无效

    ((()) A(())),如这种情况,只需要一次就好了

    题目没有说明左右拆的情况,我两边都进行了考虑

    这个题目有点坑的是,求得是最小拆盒子的次数,但是在你不知道这个盒子是否空的时候,提交空的盒子不拆能够通过,否则通不过。

    这个应该考得就是你的思考问题全面不全面吧,面试的时候有这样的题目,自己能够发现和面试官讨论最好了

    import java.util.LinkedList;
    import java.util.Scanner;
    public class Main2{
        public static void main(String[] args){
            Scanner in = new Scanner(System.in);
            while(in.hasNext()){
                char[] strA = in.nextLine().toCharArray();
                int count = getCount(strA);
                System.out.println(count);
            }
            
            in.close();
        }
        /**
         * 左右拆盒子次数的最小值
         * @param strA
         * @return
         */
        public static int getCount(char[] strA){
            int left = getLeftCount(strA);
            int right = getRightCount(strA);
            return left>right?right:left;
        }
        /**
         * 右边开始拆
         * ):一次拆盒子,count++
         * (:说明这次是无效的拆盒子,所以count--
         * @param strA
         * @return
         */
        public static int getRightCount(char[] strA){
            if(strA==null||strA.length==0){
                return 0;
            }
            int count = 0;
            LinkedList<Character> stack = new LinkedList<Character>();
            for(int i=strA.length-1;i>=0;i--){
                if(strA[i]=='A'){
                    return count;
                }
                if(strA[i]==')'){
                    stack.push(')');
                    count++;
                }else if(strA[i] == '('){
                    stack.pop();
                    count--;
                }
            }
            return count;
        }
        /**
         * 左边开始拆
         * (:一次拆盒子,count++
         * ):说明这次是无效的拆盒子,所以count--
         * @param strA
         * @return
         */
        public static int getLeftCount(char[] strA){
            if(strA==null||strA.length==0){
                return 0;
            }
            int count = 0;
            LinkedList<Character> stack = new LinkedList<Character>();
            for(int i=0;i<strA.length;i++){
                if(strA[i]=='A'){
                    return count;
                }
                if(strA[i]=='('){
                    stack.push('(');
                    count++;
                }else if(strA[i] == ')'){
                    stack.pop();
                    count--;
                }
            }
            return count;
        }
    }
  • 相关阅读:
    多状态场景:后端只记录行为,不记录行为的含义,比如产品定义的状态值含义;行为是客观的,不变的。
    Golang协程池的使用 原创 360质量效能 360质量效能 2021-05-28
    &strct new
    【Golang】图解函数调用栈
    Mybatis-Plus的应用场景及注入SQL原理分析
    倒计时时间到触发事件
    浅析软件供应链攻击之包抢注低成本钓鱼
    腾讯代码安全指南开源,涉及C/C++、Go等六门编程语言 https://mp.weixin.qq.com/s/yzg5uVnoJDTyaH2Wn8Vo7w
    58黄页标签提取及海量多分类优化
    引用站点策略: strict-origin-when-cross-origin 引用站点策略: no-referrer-when-downgrade
  • 原文地址:https://www.cnblogs.com/bbbblog/p/5706712.html
Copyright © 2011-2022 走看看