入围名单是通过我们的大学根据我们的简历和学习成绩完成的。我入围并接受了两次 45 分钟的面试,每次中间有 15 分钟的休息时间。当我通过环聊与 Google 的面试官进行视频通话时,这两次都是技术回合,涉及在共享的 Google 文档中进行动手编码。
第1轮:
问题:布尔表达式以字符串的形式给出。它包含一个变量 x;逻辑运算符——“and”、“or”和关系运算符——“>”、“<”(没有 >= 或 <=)。查找表达式的计算结果是否始终为 False。如果是,输出 False,否则如果至少存在一个 x 使得给定的表达式可以为真,则输出真。
例子:
1. “x<0 and x>5”
Output – False
Explanation – This can never be true as there is no ‘x’ such as x<0 and x>5. So, the given boolean expression always evaluates to false.
2. “x>0 or x<-1”
Output – True
Explanation – We have at least one ‘x’ for which given boolean expression evaluates to true. For example, put x=2 in the given expression, and it evaluates to true.
提示:只要布尔表达式中只有 ‘or’,结果总是为真。 (例如:x>0 或 x<0 – 存在一些 x 使得这是真的,无论表达式的后半部分是什么,它都会评估为真,因为只有“或”存在。如果不存在“或” (只有“and”),然后我们检查表达式——如果你发现至少两个矛盾的表达式,如示例 1(即它们的解集不相交),那么输出为 False(因为我们只有 ‘and ‘ 逻辑运算,除非所有表达式都为真,否则其值为假),否则为真。
当表达式中同时存在“和”、“或”时,我不知道如何解决这个问题,而且我在互联网上的任何地方都找不到这样的问题。
我请求阅读这篇文章的人友好地贡献代码来解决这个问题。 (最好在 C++ 中)
//Write Java code here
public class BooleanExp {
public static void main(String[] args) {
String exp1 = "x<0 and x<-5 and x>100";
String exp2 = "x<0 and x<5";
String exp3 = "x>5 and x<0";
String exp4 = "x<0 or x>5";
String exp5 = "x>5 and x<0 and x<100";
String exp6 = "x<-100 and x>100";
GetDomain(exp1);
GetDomain(exp2);
GetDomain(exp3);
GetDomain(exp4);
GetDomain(exp5);
GetDomain(exp6);
}
public static void GetDomain(String exp) {
if (exp.contains("or")) {
System.out.println("true");
return;
}
String subExp[] = exp.split(" ");
int domain[] = new int[10];
String strDomain = "";
Boolean flag = true;
int value;
for (int i = 0; i < subExp.length; i++) {
if (!subExp[i].equals("and")) {
if (subExp[i].charAt(1) == '<') {
if (subExp[i].charAt(0) == 'x') {
if (strDomain.isEmpty())
strDomain = "<" + subExp[i].substring(2);
else if (strDomain.charAt(0) == '>' && Integer.parseInt(subExp[i].substring(2)) < Integer
.parseInt(strDomain.substring(1))) {
flag = false;
break;
}
} else {
if (strDomain.isEmpty())
strDomain = ">" + subExp[i].substring(2);
else if (strDomain.charAt(0) == '<' && Integer.parseInt(subExp[i].substring(2)) > Integer
.parseInt(strDomain.substring(1))) {
flag = false;
break;
}
}
} else if (subExp[i].charAt(1) == '>') {
if (subExp[i].charAt(2) == 'x') {
if (strDomain.isEmpty())
strDomain = "<" + subExp[i].substring(2);
else if (strDomain.charAt(0) == '>' && Integer.parseInt(subExp[i].substring(2)) < Integer
.parseInt(strDomain.substring(1))) {
flag = false;
break;
}
} else {
if (strDomain.isEmpty())
strDomain = ">" + subExp[i].substring(2);
else if (strDomain.charAt(0) == '<' && Integer.parseInt(subExp[i].substring(2)) > Integer
.parseInt(strDomain.substring(1))) {
flag = false;
break;
}
}
}
}
}
System.out.println(flag);
}
}
// This code is contributed by Arsalaan Javed
Output:
false
true
false
true
false
false
第二轮:
问题:给定一个字符串,找到分割字符串的最小切割次数,以便所有结果子串都是回文。
Example: “google”
Output: 2
Explanation: Minimum number of cuts to partition “google” into palindromes = 2 that is –
goog|l|e – where ‘|’ refers to a cut, the three resulting palindromes are “goog”, “l”, “e”. Therefore, the minimum number of cuts required = 2.
提示:参考这篇文章。