首页 > 试题广场 >

拆礼盒

[编程题]拆礼盒
  • 热度指数:2595 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
小v所在的公司即将举行年会,年会方案设计过程中必不可少的一项就是抽奖活动。小v在本次活动中被委以重任,负责抽奖活动的策划;为了让中奖的礼物更加精美且富有神秘感,打算采用礼品盒来包装品,此时小v发挥了自己的创意想捉弄一下获奖的同事,便采取了多重包装来包装奖品。

现给出一个字符串,并假定用一对圆括号( )表示一个礼品盒,0表示,你能据此帮获奖者算出最少要拆多少个礼品盒才能拿到奖品吗?

输入描述:
一行字符串,仅有'('、')'、'0' 组成,其中一对'(' ')'表示一个礼品盒,‘0’表示奖品;输入的字符串一定是有效的,即'(' ')'一定是成对出现的。


输出描述:
输出结果为一个数字,表示小v要拆的最少礼品盒数量
示例1

输入

(()(()((()(0)))))

输出

5
示例2

输入

(((0)))

输出

3
(()(()()(((()(())))))()()()(()()()))()()()((((0))))()()()(()()()()()()))
这个用例左右括号数量不一样,由开始到礼物位置得到的结果和由礼物位置到结束的结果不一样
发表于 2020-03-09 13:09:55 回复(5)
怎么突然蹦出一道这么简单的
private static int solution(String str) {

        // TODO Write your code here 
        int count = 0;
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i)!='0'){
                if (str.charAt(i)=='('){
                    count++;
                }
                if (str.charAt(i)==')'){
                    count--;
                }
            }else
                break;
        }
        return count;
    }

发表于 2020-02-23 18:00:19 回复(0)
/*
本来是栈,但是这里很简单的用计数器就可以了
*/
int solution(string str)
{
    int L = 0;
    int sum = 0;
    for (int i = 0;i<str.size();i++){
        if(str[i] == '(')   L++;
        else if(str[i] == ')')  L--;
        else if(str[i] == '0')  {
            sum = L;
            break;
        }
    }
        // TODO Write your code here
 
    return sum;
}

发表于 2019-12-28 13:38:06 回复(0)
0左边成对的括号都不用拆,因为这样的括号代表的是空礼品盒;未成对的都要拆,因为它们包着0,与之成对的括号在0的右边。
因此只考虑0左边左括号,对未成对的括号进行计数,遇到左括号加1,遇到右括号减1,平衡掉一个左括号,最后剩下的左括号数就是最少要拆的礼品盒数目。
private static int solution(String str) {
    // TODO Write your code here 
    int count = 0;
    for(int i = 0; i < str.length(); i++){
        if(str.charAt(i) == '(')
            count ++;
        if(str.charAt(i) == ')')
            count --;
        if(str.charAt(i) == '0')
            break;
    }
    return count;
}


发表于 2021-02-09 14:15:27 回复(1)
def solution(s):

    # 0左边的左右括号数目的差值不就是答案吗,因为右括号肯定有左括号对应,直接抵消了
    a = s.split('0')[0]
    b = a.count('(')
    c = a.count(')')
    return abs(b - c)
    pass

if __name__ == '__main__':
    input = input()
    print(solution(input))

编辑于 2020-12-09 16:52:32 回复(0)

import java.io.*;

/**
 * Welcome to vivo !
 */

public class Main {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String inputStr = br.readLine();
        int output = solution(inputStr );
        System.out.println(output);
    }

    private static int solution(String str) {
        if(str == null || str.equals("")){
            return 0;
        }
        if(str.split("0").length == 0){
            return 0;
        }
        String leftString = str.split("0")[0];
        int result = 0;
        char[] leftChar = leftString.toCharArray();
        for (int i = 0; i < leftChar.length; i++) {
            if(leftChar[i]=='('){
                result++;
            }else{
                result--;
            }
        }
        return result;
    }
}
编辑于 2024-01-24 09:38:06 回复(0)
int solution(char* src) {
    int num = 0;
    char *str = src;
    while(*str != '\0' )
    {
       if(*str == '(')
           num++;
       if(*str == ')')
           num--;
       if(*str == '0')
           break;
       *str++;
    }
    return num;
}
发表于 2022-07-16 18:47:53 回复(1)
import java.io.*;
public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String inputStr = br.readLine();
        int output = solution(inputStr );
        System.out.println(output);
    }
    
    // ------------------------------------------------------------------------
    private static int solution(String str) {
        StringBuffer s = new StringBuffer(str);
        while(s.indexOf("()") >= 0){        // 去掉所有连着成对的(),空礼盒不需要拆
            int index = s.indexOf("()");
            s.delete(index,index+2);
        }
        return s.length()-s.indexOf("0")-1; // 剩下的数0的左边或者右边的单括号数就行
    }
    // ------------------------------------------------------------------------
}

发表于 2021-09-22 10:51:02 回复(0)
这个题我感觉挺简单的。通过c语言,读取‘0’的左边的括号数量,用左括号减去右括号便可以得到需要拆的礼物盒。
#include<stdio.h>
int main()
{
    char c;
    int b=0,d=0;
    while((c=getchar())!='0')
    {
        if(c=='(')
        {
            b++;
        }
        if(c==')')
        {
            d++;
        }
    }
    printf("%d",b-d);
}


发表于 2021-08-29 16:20:27 回复(1)
private static int solution(String str) {

        // TODO Write your code here
        int cnt = 0;
        for(char ch : str.toCharArray()){
            if(ch == '0'){
                break;
            }else if(ch == '('){
                cnt++;
            }else if(ch == ')'){
                cnt--;
            }
        }
        return cnt;
    }

发表于 2020-06-06 23:57:36 回复(0)
intsolution(string str)
{
    intsum = 0;
 
        // TODO Write your code here
   stack<char> s;
    for(charc:str)
    {
        if(c=='(')
            s.push(c);
        if(c==')')
            s.pop();
        if(c=='0')
            returns.size();
    }
    returnsum;
}
发表于 2020-06-04 17:04:33 回复(0)
def solution(s):
    count = 0
    for i in s:
        if i == "(":
            count += 1
        elif i == ")":
            count -= 1
        elif i == "0":
            break
    return count

if __name__ == '__main__':
    input = input()
    print(solution(input))

发表于 2020-03-07 16:44:33 回复(0)

阅读理解0分
在找到 "0" 之前,凡遇到成对的"()"表示一个完整的 盒子,可以丢掉,也可以拆开。如果选择丢掉,那么output是最小的拆盒子数。
sum++ 是说选择拆开一层包装,sum-- 说明 试着拆开后发现 这是成对的"()" 空盒子,不如不拆,可以丢掉,不计入最小的拆盒子数中

private static int solution(String str) {
        int sum = 0;
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)=='0'){
                break;
            }else if(str.charAt(i)=='('){
                sum++;//拆开一层包装
            }else{
                sum--;//"()"情况的盒子可以不用拆开,直接丢掉即可
            }
        }  
        return sum;
    }
发表于 2020-03-02 21:58:26 回复(0)
import java.io.*;
 
/**
 * Welcome to vivo !
 */
 
public class Main {
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String inputStr = br.readLine();
        int output = solution(inputStr );
        System.out.println(output);
    }
 
    private static int solution(String str) {
 
        // TODO Write your code here
        char[] arr = str.toCharArray();
        int count = 0;
        for(int i = 0; i < arr.length; i++){
              if(arr[i] == '('){
                  count++;
              }else if(arr[i] == ')'){
                  count--;
              }else if(arr[i] == '0'){
                  return count;
              }
        }
        return 0;
    }
}

发表于 2020-01-03 20:52:11 回复(0)
function solution(str) {
    let tempArr = Array.from(str);
     
    function getNum(tempArr){
        let n = tempArr.findIndex((v,i) => v == '('&& tempArr[i+1] == ')');
        if(~n){
            tempArr.splice(n,2);
            returngetNum(tempArr);
        }
        returntempArr.filter(i => i === '(').length
    }
     
    returngetNum(tempArr);
}

发表于 2019-11-20 09:07:16 回复(0)
defsolution(s):
    a=s[0:s.find('0')]
    returna.count('(')-a.count(')')
    pass
 
if__name__ =='__main__':
    input=raw_input()
    printsolution(input)
发表于 2019-11-19 14:35:54 回复(0)