登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 反转两次的数字】
/ y7 x% d6 k: h5 H" _
/ A4 P0 x t- A8 S6 q: m4 I解题思路
' Y" K* Q+ D) D3 S7 l* k' ?通过不断 %10 取最后一位即可反转数字。
9 u. y2 z3 G6 o' U7 f& K3 W7 R. V3 x, L. q% `: Z2 G7 ]3 Z9 Y
代码展示" C* i: N* i$ A0 a2 ` L
3 w4 k# v: v3 v8 O5 Gclass Solution {
+ |5 H6 y8 [; B public boolean isSameAfterReversals(int num) {- U7 q& _# @% }5 r! e
return reverse(reverse(num)) == num;) j0 e) ?, _3 r/ j( I
}) e5 ^% r2 }7 I4 N6 g) S# n
* [8 d/ n6 n# l0 C6 t& v int reverse(int num) { H# S. L0 H4 K/ {1 }
int ret = 0;
9 ^* f+ `# g/ H. n r( O for (; num > 0; num /= 10) {
3 q* O& O% [: I/ |5 l9 |$ ^ ret = ret * 10 + (num % 10);! ~. z. I% z n
}
, D4 K8 |" y, p7 F' N4 x0 V return ret;/ q4 r( q5 W& u! \( e" K
}: R! Z L# I& d3 ] b) H% i
}, Q' C; d! }- J( g, Y1 J9 ^. l
9 ?9 }1 E: Y* L( W0 \
* L" L4 ~2 k( w
【 NO.2 执行所有后缀指令】
! v/ E0 U) ^5 @; \* G# d3 U. H8 c2 ^
解题思路/ J" W/ G( g q4 s
模拟执行即可。2 {/ i* D+ s5 @5 Y: O0 W- I" A" m
, L! @2 x2 P4 l/ n7 F
代码展示
2 g7 N* @- y% H* W# E5 e3 a8 l9 v5 C; y$ \1 Q1 Y* Y# E
class Solution {. L( h" N5 R+ ?) r( \4 o
int[] dx, dy;
/ @6 h/ f5 u T$ W; k: |$ s% Y5 F7 [5 ?' [, K+ ]7 q' d) d7 N( a3 g
public int[] executeInstructions(int n, int[] startPos, String s) {& m7 H; r* I& \
dx = new int[256];) {+ O* J3 |: R; R4 y: a- G
dy = new int[256];
1 \; h p; r, P# e dy['L'] = -1;
: l6 @, e: \- e4 o dy['R'] = 1;( }* l- M( {+ ~3 c& U8 V" Y
dx['U'] = -1;
5 P1 ]: k8 a4 i6 [3 z( E) | dx['D'] = 1;
9 g/ N% u+ V" b0 }' H0 B& Z u9 c int[] result = new int[s.length()];
# X R5 g9 k1 [ for (int i = 0; i < s.length(); i++) {
9 V# \6 P6 W$ W) o result[i] = execute(n, startPos, s.substring(i));2 O' D( N2 `) p9 f6 {" Y
}
# [" i0 i, v4 P5 A return result;! y& H/ s; p5 f
}# F2 a4 v4 ]) @! T( X# q) i
9 @- d/ W& d2 j; E/ g9 s
int execute(int n, int[] startPos, String s) {2 ^ \: @7 Y/ J8 k, g# y
int x = startPos[0], y = startPos[1]; k, e: b/ Y' u# M- v7 N
for (int i = 0; i < s.length(); i++) {* D+ R4 f0 H2 L6 H) L, j
char c = s.charAt(i);
' i0 [: I" P3 } x += dx[c];+ ~5 C/ w. J! t" d" T
y += dy[c];1 F% K0 v) |$ Q7 d1 [( R
if (x < 0 || x >= n || y < 0 || y >= n) {
8 V" s! N8 K; v; s3 I6 y5 l return i;
) b+ X M; h) K }& L2 p _+ _" c1 d
}
! Q* R4 d0 O' @' _+ K ` return s.length();
, n8 y. c, Z r6 r }9 T( y6 H4 ^2 I8 D
}/ u9 | @) S. k6 [3 {# d8 y
* V d' F/ J9 \% J
- ]7 W7 f. @( o* u0 j【 NO.3 相同元素的间隔之和】
2 a* D+ A) K. ]9 l9 _
: N& ?+ ?, @+ J9 y; p# _# x/ |解题思路# I1 u; v5 Y6 w
记录每种值出现的所有位置,将这些位置排序,然后求出前缀和。! D2 S0 |# m9 L7 R9 P# J) {; p
* @1 }- }+ w i
利用前缀和快速计算间隔之和。
% v$ X w- g! Q3 j
) W! R$ D3 k( ?- c代码展示
% r9 C. _' B" ~$ r+ u, _, I: p$ M; o. w- q/ q# \
class Solution {. N$ }$ ^( _( Y2 B' I$ N: m" N
public long[] getDistances(int[] arr) {* |& T, N/ f( ~; O# E7 [# h: e7 p
Map<Integer, List<Long>> positions = new HashMap<>();
3 I9 N2 h9 o) @" ? for (int i = 0; i < arr.length; i++) {
/ K, F- N. W8 A% ? P if (!positions.containsKey(arr[i])) {. `# n. G3 U2 ]* K# w; s/ g$ h
positions.put(arr[i], new ArrayList<>());, o c* o e' p# W3 d9 A% Z
}
" a. E7 e' Y6 H positions.get(arr[i]).add((long) i);8 _: G+ d5 c8 e& X. `/ D7 n3 x
}0 o+ p6 E! a" }. K
Map<Integer, List<Long>> posPreSum = new HashMap<>();
) `$ b" {8 ~5 _- ~ for (var e : positions.entrySet()) {. S) ~$ l& Z3 O& T! g
var pos = e.getValue();
' y% E2 S ~. \% h& A! ~8 b Collections.sort(pos);
6 \1 S! Z0 ^$ ^ List<Long> preSum = new ArrayList<>();
# q4 J. [: W2 Z1 n ?4 i# ? preSum.add(pos.get(0));
$ l4 r6 a, n. A1 A. i1 r! p* ~ for (int i = 1; i < pos.size(); i++) {
) q% `6 t! h* z, ~ preSum.add(preSum.get(i - 1) + pos.get(i));
. D I( p/ I0 y' } }
6 G; r5 a1 w; N- A6 Y% H2 n+ C posPreSum.put(e.getKey(), preSum);
8 w& n& x& \ @& o7 c! q6 h }" S0 k2 v# o7 c" q
; O3 U! c5 B J5 n
8 p+ a% S7 z$ c8 n long[] result = new long[arr.length];8 Z+ @* w4 B- S1 I
for (int i = 0; i < arr.length; i++) {
, K2 R8 e& q: h/ N List<Long> pos = positions.get(arr[i]);
0 z* U, s. v/ t% m" D2 A: ^ List<Long> preSum = posPreSum.get(arr[i]);4 X: x; s' \7 L. B
long n = preSum.size();1 E ~' j9 @( Q: T4 L
long p = bSearch(pos, i);
, t# Z9 v( C# e5 \ long left = 0, right = 0;9 H8 b: q' {4 t! D( ~
if (p > 0) {
7 q5 g- f! \4 x left = p * i - preSum.get((int) (p - 1));+ s" { ?0 ~* G/ M/ p' a
}+ N' v6 u) q% \) m
if (p < n - 1) {; T0 n; r/ I' B! L# N
right = preSum.get(preSum.size() - 1) - preSum.get((int) p) - (preSum.size() - p - 1) * i;
' x6 f6 A, M- J- U }
! `6 a ~( j' w3 o result[i] = left + right;* n9 q% d, y" y! C5 ?2 Y
}7 D0 d f9 y; W8 i w* ?) A
return result;. d+ [' G1 z4 u& t+ l. P, M5 u/ Z
}& p4 |$ ~) Q- F' C
1 a$ S. ?, B0 ^7 N. v
long bSearch(List<Long> list, long target) {: s+ Y6 n) ]& s* n9 O
int l = 0, r = list.size() - 1;- z* Q+ P1 f4 c3 i- d! G
while (l + 1 < r) {
4 G3 c( y# D: Z. w4 f% S int mid = (l + r) / 2; S8 e+ Q. u. g( [
if (list.get(mid) == target) {
+ A$ t( A# l5 Z7 O# b return mid;
2 ? f( D7 y: E, \8 G* ^$ i% K }! m) z w$ y4 w& ?, Y0 H5 P
if (list.get(mid) < target) {
/ y. T: L6 ^1 T; s l = mid;
; Y9 X$ d) f; p/ B% A. ^; l5 S } else {" r8 {0 i$ f" c/ H0 v& k' x
r = mid;5 @: A! W, w) g- U
}
. ?/ f2 M( U$ N1 G1 v+ u ` }
! i* n* M) Z: F I' n return list.get(l) == target ? l : r;
& f; [% V. c" s3 D5 k( G }
# o n" I9 f9 F* \}
( z, s7 _% i3 @
! ~2 `& H2 B3 x9 {2 Z
$ P& @" V- a6 X; f8 V! \【 NO.4 还原原数组】0 b! K5 e: ~' B9 {
$ A8 S9 i" ?" A6 C解题思路/ C5 x+ Z0 R% w9 H1 m& S
首先要找到 k,枚举 nums 两两差值,统计每种差出现了多少次,若出现次数少于 nums.length / 2 那么这个差值一定不是 k。
; {6 q& U% s. V- x0 p+ E( b5 e! q2 D$ G0 r& N4 \; S& ^: y
然后对于每种出现次数不少于 nums.length / 2 的差值,把它当作 k 尝试还原数组。
' V, x# K; t" j3 D) @ i! b* T
- e# ] S. M8 a. z3 Y! U$ d F代码展示& t2 ]) Y+ z3 f9 O3 i
; p% F1 s& [4 t9 ?! R) Aclass Solution {. E) C8 Z( ?3 U& Q/ L( V- p' D
public int[] recoverArray(int[] nums) {
+ }! y0 U. @. E! a; U# f9 N$ K. ~8 I$ W Arrays.sort(nums);. R! T* D/ G( B8 x/ X2 r
Map<Integer, Integer> count = new HashMap<>(); m/ M" J7 ]7 \* ~7 w0 l& A8 q9 k
for (int i = 0; i < nums.length; i++) {! F, K) E0 J. l% O* u
for (int j = i + 1; j < nums.length; j++) {! |. p! l! Z4 O+ I2 w
if (nums[i] != nums[j]) {+ O2 }9 l- i; V; D
int diff = Math.abs(nums[i] - nums[j]);* Z" Y h; T- H& |6 P
count.put(diff, count.getOrDefault(diff, 0) + 1);
' K; q3 q% S( I2 A! b }
; ]# l3 A4 {& l0 f* Z! ^, @ }$ I% ?# G( M0 z G
}
% _% I9 V5 i0 \( ^; U for (var e : count.entrySet()) {3 ?/ j: }1 A( L* y
if (e.getValue() * 2 < nums.length) {( p/ E& _" o$ |% w
continue;0 n" u2 q- ` ~
}, t" I! R- D$ Q4 ]. q
int[] result = recoverArray(nums, e.getKey() / 2);( u7 L- a" ?' X6 p
if (result != null && result.length == nums.length / 2) {
+ W5 d7 N8 Y2 k2 Z return result;. i0 K" {6 p* P5 n' V
}7 R; Q' ` `1 }+ \% b
}
% S1 q ?8 ]4 J( F y4 F return null;
. b# K$ W D# h; H }
, ^; a) r$ P' B# C2 i; L$ B2 `( _. a4 z! G$ \* d: x( t6 C/ [
private int[] recoverArray(int[] nums, int k) {
( D+ ]% K7 {# |$ p9 v' _7 i boolean[] found = new boolean[nums.length];0 ] ^+ x- B# b" J
List<Integer> result = new ArrayList<>();
+ D! Z) y4 ^+ Q; V for (int i = 0; i < nums.length; i++) {' a! c5 l5 {% b: E1 h9 o! E: c
if (found[i]) {
9 l: ?$ W( ?+ u: H/ D+ @1 I& h- u continue;
. V+ M- b' W( B1 Q. z+ S! U" u }
7 _8 N3 e2 i0 k* H$ s int lower = nums[i];. |; E7 S( G- p" _. V; j
int higher = lower + k * 2;
' s" f) l; O& M8 d( [5 g int p = bSearch(nums, found, higher, i + 1, nums.length - 1);. k) w& ~/ Q% h2 S9 c
if (nums[p] != higher) {6 H* t. v: c, d8 w1 I# `6 Y+ p
return null;0 o8 E& B7 U% l
}
0 \ I! C/ [ X5 v5 }5 y$ E/ `* F found[i] = true;
8 d+ c" b6 r( e' n" Q3 H1 }9 n0 J found[p] = true;
3 K. ~, n, a w* \ result.add(lower + k);6 x" P [+ f" y j+ Q* C
}
; s' }4 \$ m( n( c E return result.stream().mapToInt(i -> i).toArray();
' Z6 `/ z5 I7 i9 @7 ]# `* e5 y }9 H/ m( h& t& j7 ~8 x
. p2 T8 A6 [; B" i9 x) I // 在 [l, r] 中找到第一个 found = false 的 target3 c+ J4 P* e0 ^2 S' o2 Z6 P/ f
int bSearch(int[] list, boolean[] found, int target, int l, int r) {, f w2 B8 N6 n8 i+ a
while (l + 1 < r) {- G+ |! E' E D3 v) E: ?4 Q8 R, v$ R
int mid = (l + r) / 2;2 l' I7 a3 j' P. I
if (list[mid] < target || (list[mid] == target && found[mid])) {
: P& z) T6 q7 Q8 u l = mid;5 l: A0 D( S# A8 v' P
} else {
0 q0 d' H- j! K9 ^$ P6 t r = mid;/ P8 c: k; `& u% I& R* M7 V
}
( ]. @/ ?) H( a0 u+ E }* [; @6 h; i( X. r- [
return list[l] == target && !found[l] ? l : r;; ~" v, u C' B; c- t; ?: Y
}
8 k) f; d: b4 \2 p& k} |