【问题标题】:How do i turn values of characters from a given String of parens into Integers depending if their order is correct?我如何将给定字符串中的字符值转换为整数,具体取决于它们的顺序是否正确?
【发布时间】:2021-08-06 06:57:15
【问题描述】:

任务是将给定的括号字符串示例:“(())”设置为数字 0,1 和 -1。

如果给定的括号“(”在给定的字符串中有一对“)”,则数字 0 将是“(”的整数。
如果给定的括号“)”在给定的字符串中有一对“(”,则数字 1 将是“)”的整数。
如果它们都没有一对,或者更准确地说,如果它们在给定的字符串中没有闭合,则数字 -1 将是 "(" 或 ")" 的整数。
例如:

1.Input:      2.Input:      3.Input    ​
(()           ())           ((())(()))))
Output:       Output:       Output:
-101          01-1          0001100111-1-1

我尝试使用堆栈检查括号是否按正确的顺序,但我无法根据条件为它们设置值。

String parens="(())";
        Stack<Character> s = new Stack<>();
        char c;

        for(int i=0;i<parens.length();i++) {
            c=parens.charAt(i);
            if(c=='(')
                s.push(c);
            else if(c==')') {
                if(s.empty() || s.peek()!='(')
                    continue;
                else
                    s.pop();
            }
        }

        if(s.empty()) {
            System.out.println("Correct");
        }else {
            System.out.println("Incorrect");
        }

【问题讨论】:

  • 这很难,因为您不知道前导 ( 是否匹配,基于字符串后面的匹配。您需要跟踪这些字符在“数字”中的位置,然后根据最后的结果返回并调整它们。
  • 我也很好奇大括号是否可以匹配括号或者这两个需要独立跟踪。如果是后者,它会增加更多的复杂性。
  • @markspace 我认为大括号是一个错误。示例仅显示括号。
  • 我会改正那个错字。谢谢你指出:)

标签: java stack


【解决方案1】:

虽然您的一般想法是正确的 - 它需要进行调整以适应主要任务“将大括号转换为数字”。

让我们为解决任务做下一个假设:

  • 将使用按索引的结果字符串的临时数组
  • 将使用用于保存已打开(尚未关闭)大括号索引的堆栈

接下来是算法:

  1. 使用下一条规则迭代给定的字符串:
  • 如果堆栈为空且当前索引处的字符为 ')' - 当前索引为“-1”
  • 如果堆栈为空且当前索引处的字符为 '(' - 将当前索引推入堆栈
  • 如果堆栈不为空且当前索引处的字符为 ')' - 将当前索引的结果设置为“1” - 并且在弹出索引的设置结果处从堆栈中弹出元素(匹配的左括号索引)为“0”
  • 如果堆栈不为空且当前索引处的字符为 '(' - 将当前索引推入堆栈
  1. 遍历字符串后 - 对于堆栈中的每个元素 - 结果应为“-1”
  2. 将所有结果合并为 1 个字符串

代码:

private static String convert(String input) {
    String[] result = new String[input.length()];

    Stack<Integer> openPositions = new Stack<>();

    for (int i = 0; i < input.length(); i++) {
        char currentChar = input.charAt(i);

        if (openPositions.isEmpty()) {
            if (currentChar == ')') {
                result[i] = "-1";
            } else {
                openPositions.push(i);
            }
        } else {
            if (currentChar == ')') {
                result[i] = "1";
                result[openPositions.pop()] = "0";
            } else {
                openPositions.push(i);
            }
        }
    }

    openPositions.forEach(index -> result[index] = "-1");

    return String.join("", result);
}

【讨论】:

  • 我相信你打错了。 result[openPositions.pop()] = "1"; 应该是result[openPositions.pop()] = "0";
  • 非常感谢,它确实奏效了,这是对我的想法的一个很好的补充! :D
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 2014-05-28
相关资源
最近更新 更多