20230920 华为笔试 591 (附代码)
最后一题也太恶心了,不知道哪个样例没过
t1:过了100%
先找到最小的值的下标比如说是x,那么先遍历x->n-1再遍历 0->x-1,记录满足target的下标就可以了
代码丢了
t2:过了100%
bfs遍历就可以了
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
int[][] mp = new int[n][m];
int[][] dp = new int[n][m];
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
mp[i][j] = scanner.nextInt();
dp[i][j] = Integer.MAX_VALUE;
}
}
LinkedList<int[]> que = new LinkedList<>();
for (int i = 0; i < n; ++i) {
if (mp[i][0] == 1) {
dp[i][0] = 0;
que.add(new int[]{i, 0});
}
}
int cnt = 1;
int[][] dir = new int[][]{{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
while (!que.isEmpty()) {
int size = que.size();
for (int i = 0; i < size; ++i) {
int[] first = que.pollFirst();
mp[first[0]][first[1]] = 0;
for (int j = 0; j < 4; ++j) {
int dx = first[0] + dir[j][0];
int dy = first[1] + dir[j][1];
if (dx < 0 || dx >= n || dy < 0 || dy >= m || mp[dx][dy] == 0 || dp[dx][dy] != Integer.MAX_VALUE)
continue;
dp[dx][dy] = cnt;
que.addLast(new int[]{dx, dy});
}
}
cnt++;
}
int res = Integer.MAX_VALUE;
for (int i = 0; i < n; ++i) {
res = Math.min(res, dp[i][m - 1]);
}
if (res == Integer.MAX_VALUE) res = -1;
System.out.println(res);
}
t3 只过了97%,纯模拟题,需要注意一些细节的处理
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextLine()) {
String s = scanner.nextLine();
if (s.startsWith("let")) {
String fieldName = getFieldName(s);
if (fieldName == null) continue;
mp.put(fieldName, delParam(s));
} else if (s.startsWith("out")) {
String fieldName = s.substring(4, s.length() - 1);
System.out.println(mp.getOrDefault(fieldName, "<undefined>"));
} else {
System.out.println("<syntax-error>");
}
}
}
static HashMap<String, Object> mp = new HashMap<>();
static String getFieldName(String s) {
String[] f1 = s.split("=");
if (f1.length > 2) {
System.out.println("<syntax-error>");
return null;
}
String fieldName = f1[0].trim().substring(4);
if (fieldName.charAt(0) >= '0' && fieldName.charAt(0) <= '9') {
System.out.println("<syntax-error>");
return null;
}
for (int i = 0; i < fieldName.length(); ++i) {
char c = fieldName.charAt(i);
if (!checkValid(c)) {
System.out.println("<syntax-error>");
return null;
}
}
return fieldName;
}
static Object delParam(String s) {
String[] f1 = s.split("=");
String o = f1[1].trim();
StringBuilder pre = new StringBuilder();
BigInteger v = new BigInteger("0");
char op = ' ';
for (int i = 0; i < o.length(); ++i) {
char c = o.charAt(i);
if (checkValid(c)) {
pre.append(o.charAt(i));
} else {
if (pre.length() != 0) {
Object r = cul(pre, op, v);
if (r instanceof BigInteger) {
v = (BigInteger) r;
} else {
return r;
}
pre = new StringBuilder();
}
if (c == '+' || c == '-' || c == '/' || c == '*') {
op = c;
}
}
}
if (pre.length() != 0) {
Object r = cul(pre, op, v);
if (r instanceof BigInteger) {
v = (BigInteger) r;
} else {
return r;
}
}
return v;
}
//对参数pre进行计算
static Object cul(StringBuilder pre, char op, BigInteger v) {
BigInteger pv;
try {
Long.parseLong(pre.toString());
pv = new BigInteger(pre.toString());
} catch (NumberFormatException e) {
String param = pre.toString();
if (!mp.containsKey(param)) {
return "<undefined>";
} else if (mp.get(param) instanceof String) {
return mp.get(param);
}
pv = new BigInteger(((BigInteger) mp.get(param)).toByteArray());
}
if (op == ' ') {
v = pv;
} else {
v = opNum(v, pv, op);
}
if (v.compareTo(new BigInteger(String.valueOf(Integer.MAX_VALUE))) > 0) {
return "<overflow>";
} else if (v.compareTo(new BigInteger(String.valueOf(Integer.MIN_VALUE))) < 0) {
return "<underflow>";
}
return v;
}
//执行算子
static BigInteger opNum(BigInteger pre, BigInteger cur, char op) {
if (op == '+') {
pre = pre.add(cur);
} else if (op == '-') {
pre = pre.subtract(cur);
} else if (op == '*') {
pre = pre.multiply(cur);
} else if (op == '/') {
pre = pre.divide(cur);
}
return pre;
}
//判断字符是否合法
static boolean checkValid(char c) {
if (c >= '0' && c <= '9') {
} else if (c >= 'a' && c <= 'z') {
} else if (c >= 'A' && c <= 'Z') {
} else if (c == '_') {
} else {
return false;
}
return true;
}
查看8道真题和解析