Java 如何将给定参数字符串中的字符值转换为整数,取决于它们的顺序是否正确?
任务是将给定的parens字符串例如:(())设置为数字0、1和-1 数字0将是给定字符串中“(“如果给定参数”(“有它的对”)的整数。Java 如何将给定参数字符串中的字符值转换为整数,取决于它们的顺序是否正确?,java,stack,Java,Stack,任务是将给定的parens字符串例如:(())设置为数字0、1和-1 数字0将是给定字符串中“(“如果给定参数”(“有它的对”)的整数。 数字1将是“)”的整数,如果给定的paren“)有它的pair”(“在给定的字符串中。 如果它们都没有对,则数字-1将是“(”或“)”的整数;准确地说,如果它们在给定字符串中没有闭合,则数字-1将是“(”或“)”的整数。 例如: 1.Input: 2.Input: 3.Input (() ())
数字1将是“)”的整数,如果给定的paren“)有它的pair”(“在给定的字符串中。
如果它们都没有对,则数字-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");
}
String parens=“(())”;
堆栈s=新堆栈();
字符c;
对于(inti=0;i,虽然您的总体想法是正确的,但它需要调整以适应主要任务“将大括号转换为数字”
让我们做下一个解决任务的假设:
- 将使用索引结果字符串的临时数组
- 将使用用于保存已打开(尚未关闭)大括号索引的堆栈
算法将是下一步:
使用下一个规则迭代给定字符串:
- 若堆栈为空且当前索引处的字符为“')-“-1”,则表示当前索引
- 若堆栈为空且当前索引处的字符为“(”,则将当前索引推入堆栈
- 如果堆栈不为空,且当前索引处的字符为“')”-则将当前索引的结果设置为“1”-并将堆栈中的pop元素(匹配的大括号索引)设置为poped索引的结果“0”
- 若堆栈不为空且当前索引处的字符为“(”,则将当前索引推入堆栈
迭代字符串后-对于堆栈中的每个元素-结果应为“-1”
将所有结果合并为一个字符串
代码:
私有静态字符串转换(字符串输入){
字符串[]结果=新字符串[input.length()];
堆栈打开位置=新堆栈();
对于(int i=0;i结果[索引]=“-1”);
返回字符串。join(“,result);
}
虽然您的总体想法是正确的,但需要对其进行调整,以适应主要任务“将大括号转换为数字”
让我们做下一个解决任务的假设:
- 将使用索引结果字符串的临时数组
- 将使用用于保存已打开(尚未关闭)大括号索引的堆栈
算法将是下一步:
使用下一个规则迭代给定字符串:
- 若堆栈为空且当前索引处的字符为“')-“-1”,则表示当前索引
- 若堆栈为空且当前索引处的字符为“(”,则将当前索引推入堆栈
- 如果堆栈不为空,且当前索引处的字符为“')”-则将当前索引的结果设置为“1”-并将堆栈中的pop元素(匹配的大括号索引)设置为poped索引的结果“0”
- 若堆栈不为空且当前索引处的字符为“(”,则将当前索引推入堆栈
迭代字符串后-对于堆栈中的每个元素-结果应为“-1”
将所有结果合并为一个字符串
代码:
私有静态字符串转换(字符串输入){
字符串[]结果=新字符串[input.length()];
堆栈打开位置=新堆栈();
对于(int i=0;i结果[索引]=“-1”);
返回字符串。join(“,result);
}
这很难,因为您不知道前导的(
是否匹配,这取决于字符串后面的匹配项。您需要跟踪这些字符在“数字”中的位置然后返回并根据最后的结果进行调整。我也很好奇大括号是否可以匹配括号,或者这两个括号是否需要单独跟踪。如果是后者,则会增加更多的复杂性。@markspace我认为大括号是一个错误。示例仅显示了括号。我将修复该错误。谢谢您指出:)这很难,因为您不知道前导的(
是否有匹配项,这取决于字符串后面的匹配项。您需要跟踪这些字符在“数字”中的位置然后返回并根据最后的结果进行调整。我也很好奇大括号是否可以匹配括号,或者这两个括号是否需要单独跟踪。如果是后者,则会增加更多的复杂性。@markspace我认为大括号是一个错误。示例仅显示了括号。我将修复该错误。谢谢您指出:)我相信你打错了<代码>结果[openPositions.pop()]=“1”代码>应该是结果[openPositions.pop()]=“0”代码>更新,谢谢@wjs非常感谢,它确实有效,是我想法的一个很好的补充!:我相信你打错了<代码>结果[openPositions.pop()]=“1”代码>应该是结果[openPositions.pop()]=“0”代码>更新,谢谢@wjs非常感谢,它确实有效,是我想法的一个很好的补充!:D
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);
}