登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 反转两次的数字】" c ^( N3 S! L/ h
2 Y2 y+ U. [, e; m, |解题思路
& g5 O; ?/ i& o( i3 T7 d8 Z% M通过不断 %10 取最后一位即可反转数字。/ A/ p3 Z, V1 @& C
. X, H) u0 }8 B# r6 T( O! t代码展示# p: U$ z2 ?8 M; m
0 z% K* \; N) G: Z3 q
class Solution {
5 R* h* N7 S3 P! w4 h public boolean isSameAfterReversals(int num) {3 E3 u0 i$ L0 g
return reverse(reverse(num)) == num;7 D; q/ G9 I( \* @! \$ i8 @5 G0 ?
}+ t+ ~- p. Y6 o7 t
0 ]$ c# T% h4 H' V5 H) s int reverse(int num) {
* f" g) S- b& o% U9 B int ret = 0;) w- ^& a" z1 ~' j( T; I) Q
for (; num > 0; num /= 10) {
1 K U: S. U; u! H Q ret = ret * 10 + (num % 10);8 t; C A L9 F( E
}, K9 [8 L+ |/ E( C; z7 \
return ret;
& M: f: H5 X# J+ L }
4 _& S6 h- t6 r( t: o; _}
# B; J% x; S: m. _1 Y* ?0 M% ?- a: t, B5 L9 d8 J. z, ~& e) C1 N0 N
& X8 N* X- X- f7 t5 S
【 NO.2 执行所有后缀指令】
, P/ A% K; a" p
! h; H, Z' K! U# s3 H0 G6 ?% `8 I解题思路. G5 Y4 {5 T% B8 j6 N9 V3 m
模拟执行即可。$ J6 c# i4 S" K, e4 f, s3 r8 j/ }( \
" g S' j4 N( I6 H3 l' c
代码展示
; |5 @) Y j4 x& Z+ U+ t. n
2 {+ D( m6 J, ^" Z/ gclass Solution {) H' x( l( n1 ^; { ~; |
int[] dx, dy;0 o+ Y( w. L/ ?0 A
0 }0 O2 W9 j+ o: r public int[] executeInstructions(int n, int[] startPos, String s) {
( R: g0 ^. Z4 }: `, H9 c$ N) F dx = new int[256];: K {4 e4 |. P! D' Z) @
dy = new int[256];
+ ]( v' ]1 K% [1 L6 `4 K+ A" ~8 ? dy['L'] = -1;
- _3 \% V5 G6 U dy['R'] = 1;
7 |3 Z/ }& [5 c) M" _! W2 T8 k dx['U'] = -1;
" z& F7 z- }3 |- I+ r dx['D'] = 1;: |' R; n' D9 q
int[] result = new int[s.length()];0 q- r1 y3 g" n/ {1 ~
for (int i = 0; i < s.length(); i++) {
& g( ]; M$ a6 w7 i1 w( { result[i] = execute(n, startPos, s.substring(i));8 u5 y' }. n8 m( f. ?
}
* C. h" P2 N) i# ?% F( J7 Y) z return result;. }2 T2 o/ S' R, @
}$ a. L# N5 i$ [0 p' |
+ L; {. e* }) A& e int execute(int n, int[] startPos, String s) {8 ^+ T% t y0 M" }* }) H
int x = startPos[0], y = startPos[1];
, @7 L! G, _3 t for (int i = 0; i < s.length(); i++) {
* f# u$ C+ h) n4 X char c = s.charAt(i);
- e! ~$ F P* ]/ g0 |" Y6 ~ x += dx[c];1 g- Y6 r; n1 W
y += dy[c];
# q# Y9 R% o6 Y( s1 } \" g( A if (x < 0 || x >= n || y < 0 || y >= n) {
9 P4 |1 |3 A3 x; b0 a* G return i;
( ?( d: o* a1 L3 F4 b }
0 |* X' F' v( e) P }: F8 _3 {* A4 ]5 b* C9 B, }7 t
return s.length();7 y( X9 X. u6 f' z3 O! _7 `# W. \
}" O* O) ^8 G& j8 R
}$ G" i$ m/ n3 o+ d
! k+ `! V9 h9 I5 I2 |# O
% @* ?1 z+ O8 W6 Q+ p- A* s【 NO.3 相同元素的间隔之和】1 U2 d) c3 @+ Q1 T# O/ ?& H v3 P6 G
& g8 J% G# W# W+ W' V解题思路
/ a# s* r6 z! Z/ e( S记录每种值出现的所有位置,将这些位置排序,然后求出前缀和。
" i3 i6 e$ i0 W5 z* y! r# |& e u1 t5 L; D, a; `) `) Q+ C
利用前缀和快速计算间隔之和。
7 e" r% F: j- [! g/ y3 u% f: _6 q& p1 X1 @0 j+ T
代码展示
1 H" l& G( p! H) L# f/ R' l R, H+ r8 x" C- V
class Solution {
" G7 `# F) x+ ~- X/ I public long[] getDistances(int[] arr) {8 h9 g( R- D: F( U4 E
Map<Integer, List<Long>> positions = new HashMap<>();# G$ a5 Z3 J1 X- \: E6 y
for (int i = 0; i < arr.length; i++) {7 Q5 e, q) \( S
if (!positions.containsKey(arr[i])) {
( I* e) z, V) l: F) a! Z0 m positions.put(arr[i], new ArrayList<>());- Z4 }$ D \. M
}
0 X; |$ Y8 r" _' T: R1 O; E positions.get(arr[i]).add((long) i);8 |' Q& f/ Y8 _3 Y
}
: Z+ q; P/ o% `& ^) M6 n8 T Map<Integer, List<Long>> posPreSum = new HashMap<>();
9 E2 y. v' |3 H, p1 x6 V6 N for (var e : positions.entrySet()) {9 m- C9 ~0 X8 p" i% F7 x% j
var pos = e.getValue();
+ o2 T# ]6 I0 \- i1 Q Collections.sort(pos);
6 Q( c3 N, F( D0 l8 h+ ^ List<Long> preSum = new ArrayList<>();
4 c2 E6 p+ {+ {) p9 B l0 g preSum.add(pos.get(0));
8 b! F' ^2 x9 n# \: ~" z6 _ for (int i = 1; i < pos.size(); i++) {# u- B7 }7 ~& s4 G2 l/ h5 k
preSum.add(preSum.get(i - 1) + pos.get(i));: T8 p0 J" } H9 d$ N
}' o7 g' g: [! K* ]8 T
posPreSum.put(e.getKey(), preSum);3 F" t1 R+ |) q
}7 s5 v( J$ ~# k6 S. y3 T
0 u) F3 k W$ N
7 O4 w8 d; C2 \2 N7 \1 T0 o- j Q' V1 d long[] result = new long[arr.length];
* R) w3 K7 c. D1 o0 R for (int i = 0; i < arr.length; i++) {
: ]' P& V/ d$ l1 m List<Long> pos = positions.get(arr[i]);+ i; [3 a; K7 A& @$ X" u
List<Long> preSum = posPreSum.get(arr[i]);
0 s; a- Q- k/ ~ long n = preSum.size();6 y6 w# I' F k! K
long p = bSearch(pos, i);
6 p2 v" p( ~( @ long left = 0, right = 0;
% t) e5 m2 E) D/ i. S N% a3 [6 J! E if (p > 0) {) ^& u! y8 \; o0 M
left = p * i - preSum.get((int) (p - 1));0 l t$ ?" D* U1 K ]) d( }
}
% W3 s8 S' R6 _; I4 ]- D8 J! b6 E if (p < n - 1) { ^7 `; V. q- ]2 S* T; }
right = preSum.get(preSum.size() - 1) - preSum.get((int) p) - (preSum.size() - p - 1) * i;
7 X# S* F, P; H( Y! q }
, g* }5 _+ n' l L0 Q( p6 u result[i] = left + right;7 G) h/ K L! n5 A: L
}+ C, D3 a2 d# H3 t2 [8 J8 p! E$ T
return result;' j" I" h" `& E" w2 P# h+ g- V
}
' R" V+ e2 B) ?7 ]% p) }# m/ P* C0 A/ e) h8 I+ |
long bSearch(List<Long> list, long target) {
" G) f- Q( P7 p( M& B/ _0 z int l = 0, r = list.size() - 1;
' i/ c0 n3 E, y" K" B9 L while (l + 1 < r) {
7 f: k" v* s0 f/ @/ U int mid = (l + r) / 2;$ L' M( r z1 d$ v& B4 d
if (list.get(mid) == target) { s' o' v6 L/ ]
return mid;
) S6 |! ^+ {$ h }' U* d/ C( C0 w7 y0 t' _
if (list.get(mid) < target) {( Y2 K6 u, W; \4 r+ Y! X
l = mid;
2 B) j; i/ |+ t3 w } else {5 ~# H# X! c2 t4 Y" q
r = mid;
% b, D0 g2 \# Z! j; O( h0 O }
6 ^ @6 M( s5 R z/ e8 Q }
8 l: z: a* @) ~* X+ x! D$ c& N return list.get(l) == target ? l : r;/ V" ]: \) a- d3 Q8 J7 D1 O
}
5 N/ w& k6 n3 N" R0 z+ O# `5 H) k}- w# D5 r8 ?& C. O3 E* L- K8 Y! k v
; e9 }9 |1 V6 o0 G+ H! @/ m0 Z4 ]+ J" _3 q0 V8 m" u$ i1 D0 }" n, _
【 NO.4 还原原数组】
- v- g; m. W0 w" ~% H
5 c( i3 f1 g& w解题思路9 Q9 F. A2 O+ ]- m% _
首先要找到 k,枚举 nums 两两差值,统计每种差出现了多少次,若出现次数少于 nums.length / 2 那么这个差值一定不是 k。3 O- r2 q9 f* R: G# D
6 s; F) O5 N0 S& p* o* y% v; l2 L/ Q然后对于每种出现次数不少于 nums.length / 2 的差值,把它当作 k 尝试还原数组。8 b8 K( G5 T5 }$ O* X. U
: b. Y( R0 y* h. b4 L- H. o- q代码展示
8 D1 {: D; I+ g. d. a
- p" x( u+ G( }class Solution {
9 y! i5 r) z) w) ^0 c6 S public int[] recoverArray(int[] nums) {
. H! K8 T0 o1 A$ ?' X2 E% U( C! \ Arrays.sort(nums);
3 Y, w2 a, @- X0 D) ^ Map<Integer, Integer> count = new HashMap<>();
% P$ ^& k+ v6 b( n# ]" O( b for (int i = 0; i < nums.length; i++) {
# y/ Y; @# S+ B( R5 x9 g for (int j = i + 1; j < nums.length; j++) {, v) b" o% m; E4 {- `& P% w) V
if (nums[i] != nums[j]) {
' i( z+ E" i, q) r) Y* p int diff = Math.abs(nums[i] - nums[j]);( A0 c7 y$ d7 ~9 y4 G, Q
count.put(diff, count.getOrDefault(diff, 0) + 1);' l2 y( D1 f) N& E
}
0 Q# {- j B3 {( n8 @ }
. M1 z/ e1 u) i6 q }. ?: [' T5 N0 E' m7 l
for (var e : count.entrySet()) { A) H& F4 h, I2 X
if (e.getValue() * 2 < nums.length) {1 s6 r& N- c, g$ W, x: Y& M
continue;) U- t* ?/ U& @: F
}( O/ b$ v5 h" V& `
int[] result = recoverArray(nums, e.getKey() / 2);
6 e9 W( v# _# u/ o if (result != null && result.length == nums.length / 2) {
0 d4 C" W' t/ L5 F4 {5 b return result;8 |. n- l" b- _/ _ F8 Y; l7 L! ?
}
5 H0 v' w" {- K }( p- t& S& L# H4 R7 M* _. @7 y
return null;
* Q' \+ c7 y$ h/ h' Q+ ~, I }
" }* l& {0 R# K- R' p( x- n; a+ B4 A* ]
private int[] recoverArray(int[] nums, int k) {' Y& p0 Y& }% C9 D6 U
boolean[] found = new boolean[nums.length];
3 B( d, k; J. u List<Integer> result = new ArrayList<>();! h% K; @3 C$ |- Y S+ E' \
for (int i = 0; i < nums.length; i++) {2 g% u( [. g4 {6 x' B
if (found[i]) {: I6 g5 {* N$ O& k* R1 @
continue;
& a% h$ e1 t V" E: E/ a }
6 v" v* m t/ H$ Z5 ]) V% d5 K6 ^ int lower = nums[i]; q$ _, C: Z# }" |
int higher = lower + k * 2;) v8 ^5 W1 _0 u2 h0 q7 x
int p = bSearch(nums, found, higher, i + 1, nums.length - 1);9 s, E2 k- v' u) G0 x
if (nums[p] != higher) {
$ }0 V# u$ ^1 ]8 y' k return null;
* s, d# }$ U/ Y y8 j; c }' @$ i. S7 X7 J6 V- g8 o) n' c
found[i] = true;
6 y: l6 \: J0 K8 d- ?6 S- K found[p] = true;
' F, `1 }2 D& `! x0 H1 ] result.add(lower + k);" M9 p' q* k7 X7 ]* Z% J+ c) K
}" U6 b" Z# b7 Z+ R. l/ K6 P# s
return result.stream().mapToInt(i -> i).toArray();
6 }3 }, C7 i' I( |+ w% h8 O }
% u# x+ e1 ]0 r( a- x/ _( Z! q- D) H1 ^: _
// 在 [l, r] 中找到第一个 found = false 的 target
' {& f/ O' Q0 u9 f- h% {7 P int bSearch(int[] list, boolean[] found, int target, int l, int r) {" r. w+ X6 y4 t/ W0 R
while (l + 1 < r) {
8 {+ p% a8 i* ^: {0 [5 {, D int mid = (l + r) / 2;7 W# l9 e' j2 a" C$ o
if (list[mid] < target || (list[mid] == target && found[mid])) {; L: r5 A) J& q* _
l = mid;
- u- h: V! T6 i } else {" w% v( Y/ l( P3 v% u
r = mid;/ V2 Q/ M2 |( j( [
}7 Z; }* s, e7 x, V
}* x' | r4 q% B9 u: F. b8 g$ F
return list[l] == target && !found[l] ? l : r;
3 u: ~1 }. ^+ J# s5 v% U }. G4 {/ W% M0 H3 _( I( P: C1 {6 }
} |