LeetCode 第 273 场周赛题解及思路
2119. 反转两次的数字
反转 一个整数意味着倒置它的所有位。
例如,反转2021
得到1202
。反转12300
得到321
,不保留前导零 。
给你一个整数num
,反转num
得到reversed1
,接着反转reversed1
得到reversed2
。如果reversed2
等于num
,返回true
;否则,返回false
。
反转来反转去,这不没变化吗?噢打扰了,前导零和后导零都无了,因为原来是个正常整数不会有前导零,只可能是反转第一次将后导零翻到前面去了,然后反转第二次时就不带这些零了。
所以要判断反转两次是否与原来数字相等,就是判断原来数字是不是不含后导零,更简化就是 判断原来数字的个位是不是 0
即可,注意,如果原来数字本身就是 0
的话反转多少次都相等。
return num == 0 || num % 10;
时间复杂度是 O ( 1 ) O(1) O(1),空间复杂度是 O ( 1 ) O(1) O(1),完整代码见 GitHub。
2120. 执行所有后缀指令
概括题目意思就是,第 i
次,机器人从 (startPos[0], startPos[1])
开始行走,依次执行下标为 i ~ s.size() - 1
的上下左右移动的指令,最多能执行多少条指令,使得执行过程中机器人始终都在 (0, 0)
到 (n - 1, n - 1)
的正方形网格内而没有走出边界,执行的指令条数就作为 answer[i]
。
一看数据范围 1 <= n, m <= 500
,那我直接模拟机器人每一次的执行指令行走就好了呀。
for (int i = 0; i < m; i++) {
int x = startPos[0], y = startPos[1]; // 每次都是从这个点开始
for (int j = i; j < m; j++) {
switch (s[j]) {
case 'L': y--; break;
case 'R': y++; break;
case 'U': x--; break;
case 'D': x++; break;
};
if (0 <= x && x < n && 0 <= y && y < n) answer[i]++;
else break;
};
};
时间复杂度是 O ( m