登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 反转两次的数字】
' ?9 S4 h& ~4 G! l8 o( m" J' i8 u
: K# L$ d: r- C2 x# X4 D V解题思路
8 K2 C2 q+ C) u$ E& ?3 M9 w通过不断 %10 取最后一位即可反转数字。- L7 L5 |/ z& j4 f0 L% y
& u y5 ^2 m7 F" j- a( R; F
代码展示 K* z& M4 {0 _ ~) m" _$ k
7 C7 n6 c( h9 q% Q6 t
class Solution {) H" E1 D- N( w. |
public boolean isSameAfterReversals(int num) {$ W3 ~8 |+ d$ O# T: Y
return reverse(reverse(num)) == num;
* b m+ X8 u/ a }
3 {; O3 q/ @# Y9 Z# a2 C2 g/ y* y' x" `7 G6 C0 i! o. o
int reverse(int num) {
; x A/ e; K" r int ret = 0;
, Y/ |9 y2 X" Q& l4 Z5 k. g- Z! p for (; num > 0; num /= 10) {
9 ~. @* d2 ]7 K ret = ret * 10 + (num % 10);
% M1 ?8 ]4 |- n }% S1 N9 f, n' J3 r g
return ret;
' h" A: | F3 F }2 z; x, u* L; D# v/ Q6 q* k" ]5 A# ~
}
* Z) Y, N- P2 r! s! G7 n$ x# V
1 |' \. W3 K' V+ K. \
7 \0 T1 f* [7 L# U! D1 s$ p【 NO.2 执行所有后缀指令】9 t( P7 V, v6 ? K
; h$ M8 e* w- _# X- i- C解题思路; R3 o( T. u3 F. _: R/ y# ]
模拟执行即可。1 Y& e; H4 j. x7 R
8 c+ b" E, q2 E# _7 i( f
代码展示
7 Q: E* ?- M3 g5 [1 u5 y& p8 x0 Q# w' k1 o
class Solution {
: |* k; a2 o: v3 U5 D% w int[] dx, dy;
1 e' e7 m) ~- w: i: g
. K2 q! e- _4 F4 l* J N* o3 c public int[] executeInstructions(int n, int[] startPos, String s) {( {+ Q: w6 l$ @5 o7 d2 \9 M
dx = new int[256];
% g# F* j+ ~+ k, L dy = new int[256];4 \0 k6 ]3 Z1 N1 ^5 h: r
dy['L'] = -1;
7 u$ \* I, G4 R dy['R'] = 1;1 z1 ^* |+ f# w, e3 _8 F& A
dx['U'] = -1;: B, G# B$ \; |
dx['D'] = 1;- m& m1 G, @2 N. D O% V, f
int[] result = new int[s.length()];" n6 t. [8 [6 q3 L
for (int i = 0; i < s.length(); i++) {
) c, L7 x$ E Z% P' Z, }: E* } result[i] = execute(n, startPos, s.substring(i));
4 h! L( d6 y0 p: | }, n( ?) e8 P* @
return result;7 M2 V: b* q# O( T
}
& Z( n% F: n5 F# \/ m# _
% u1 |+ o6 V- \& M int execute(int n, int[] startPos, String s) {7 S; d X0 q0 R
int x = startPos[0], y = startPos[1];1 B. J4 b5 e. F. T
for (int i = 0; i < s.length(); i++) {9 o% ~, L. w# @6 _; G
char c = s.charAt(i);. ^9 n2 M5 \; k3 J
x += dx[c];# X; ]( w9 h* q
y += dy[c];
# X+ C" H/ d9 m) z. C* ? if (x < 0 || x >= n || y < 0 || y >= n) {' M/ [5 ?) L* B" |8 {0 N$ @2 h! s
return i;2 `3 o' {4 m3 |( w! d$ D
}9 {5 t. U, _" n! @6 U1 o5 Q/ a1 R
}3 t8 d2 Q" O! q( n1 a) ~ U
return s.length();
/ Z& l |$ N+ b$ w) x# I }
/ K R; X' S; U v}
- q% j& k, _9 A9 T7 ^- c, ~) Y! }) v# k/ |
' j0 i3 p& @, L- L【 NO.3 相同元素的间隔之和】
) K. w2 c" p' y, G5 o2 n" C) I; v+ e! m
解题思路( A/ }' a) A" p& X2 E& j: h7 P7 `
记录每种值出现的所有位置,将这些位置排序,然后求出前缀和。. B- I: K8 f% w# w9 j2 u. I
, }$ a" D. K* Y: g$ `利用前缀和快速计算间隔之和。
/ M: X$ N: M/ F. L1 S7 W, E+ ^. H, e/ q' f; c. s+ M) m
代码展示
5 S2 E/ \% b% n9 u; V6 n
& E3 K/ T$ H& [% O5 Yclass Solution { r8 Z; h$ d/ {
public long[] getDistances(int[] arr) {5 V* B% o2 f: B* G' L( R
Map<Integer, List<Long>> positions = new HashMap<>();
1 R; [( N6 E& @ for (int i = 0; i < arr.length; i++) {
8 q ^6 n3 [2 n$ f1 G5 [4 _4 x if (!positions.containsKey(arr[i])) {
; H- u' Z! j6 h positions.put(arr[i], new ArrayList<>());. J& A* I; E# W! _" N7 g2 R' k
}& s& r j3 g/ r- p
positions.get(arr[i]).add((long) i);( X/ Z# g# k! G0 M9 O
}
' {( @2 I# x" Z; b Map<Integer, List<Long>> posPreSum = new HashMap<>();
6 b1 V& c: n n9 `( @ for (var e : positions.entrySet()) {' b9 }. C( B6 X/ ^4 z
var pos = e.getValue();- P# S% S; h" `
Collections.sort(pos);$ B& ~) }' w! S4 K- k
List<Long> preSum = new ArrayList<>();3 n0 u9 g2 c% y" Y
preSum.add(pos.get(0)); D5 Q. d- v* x7 V5 _
for (int i = 1; i < pos.size(); i++) {
" N3 ~2 _. Q- q( T4 H preSum.add(preSum.get(i - 1) + pos.get(i));# q, P# r0 J" ^- B9 V: A
}! N8 ^4 L( @( h5 U0 w* K
posPreSum.put(e.getKey(), preSum);
4 H" h3 Z) J8 g' I. I }. ~3 ?- U$ ~7 I' j' A: }$ [
6 Q) y* X+ v7 R; q7 S5 n2 S6 c: k! H
) P a" v( g) d, I3 B/ H
long[] result = new long[arr.length];
2 Y. M6 Y0 j, k( x: F5 J! A( d% | for (int i = 0; i < arr.length; i++) {
( \, ]! h7 w" U7 Q+ W7 `$ [5 h7 @* |' T List<Long> pos = positions.get(arr[i]);
$ Y5 K3 t( S3 ]7 i* F5 Q( f List<Long> preSum = posPreSum.get(arr[i]);
' c: E+ b& t- {% Z7 r1 a' ~7 b! p long n = preSum.size();
( W) G% c. \ P6 d long p = bSearch(pos, i);
9 m+ b- M+ A) [& H7 r. U long left = 0, right = 0;
) }5 J& L; Z' h/ r if (p > 0) {) T+ u- `) T) _% S. N9 c
left = p * i - preSum.get((int) (p - 1));$ p$ g' @& M0 i
}
0 l/ I- w$ j/ n: z4 o8 f if (p < n - 1) {
; T$ L8 a+ ?2 G right = preSum.get(preSum.size() - 1) - preSum.get((int) p) - (preSum.size() - p - 1) * i;2 y2 B7 E( N* I- F+ a
}/ E! w: K$ k) o/ a( i
result[i] = left + right;
% _9 L `$ o, K& R; p3 k }" i& z* {0 Z/ B2 X: T7 J; x3 \6 H1 ~
return result;
5 U& `3 R/ k- u) l3 R! f }5 X) a2 k8 Q9 A( ?$ W' Z2 d
4 p6 l0 t, [; ]) U. N( G) U K: t long bSearch(List<Long> list, long target) {1 s. O2 a8 t u! e3 U" u/ t K
int l = 0, r = list.size() - 1;- y/ `4 G$ R& X6 `& a
while (l + 1 < r) {
) m2 b9 c( p0 d. f int mid = (l + r) / 2;
% o5 ?" y! J) S if (list.get(mid) == target) {) {& B7 H$ e( t `" E/ p/ A
return mid;+ [ l, f s7 s
}( x8 k5 ] t1 o; p7 x
if (list.get(mid) < target) {( v$ a% q m( x6 ?- A" s
l = mid;7 p% a+ N3 z' L; C/ h$ y/ I! K1 `
} else {/ T% W; }2 c. I% h( Q/ P5 z+ M1 a
r = mid;
5 z6 ~1 s. p. p" Q3 F, D }
: [4 p( d, `1 t# a0 D" _( H1 x }% D1 Z2 c" z, c2 j. k' l$ U
return list.get(l) == target ? l : r;. A. H+ D. X# Z
}% y; e, N4 [- [2 h) u
}6 D4 E2 k: U Q2 n' i9 D! X
+ x6 c+ i+ p6 m! Q) l: X* f
: T Q! G7 @/ ?: H* }2 m( }【 NO.4 还原原数组】1 v& \: n3 y" M, O
+ f- |) P4 |0 k7 {' q7 n4 n: T
解题思路
7 ?6 x( W* q0 `8 h& L8 O首先要找到 k,枚举 nums 两两差值,统计每种差出现了多少次,若出现次数少于 nums.length / 2 那么这个差值一定不是 k。
4 \6 d) m; u4 f" a' Y
5 O) m# W5 }7 `0 [1 g3 P然后对于每种出现次数不少于 nums.length / 2 的差值,把它当作 k 尝试还原数组。: A- p! n7 \3 k6 b! [( e0 r
, e$ F0 Y& k5 i; y- H
代码展示
8 o0 _4 K4 V. m$ h. {# G- A
6 O. ]: q8 q5 o' _ e, t6 j9 Bclass Solution {# P) Y) H! B5 z- a* t0 y
public int[] recoverArray(int[] nums) {7 R* u$ l' C+ b3 q0 r
Arrays.sort(nums);
' ~" E* o( @* }* P4 ~ Map<Integer, Integer> count = new HashMap<>();, N( a% j( Q' X f2 p X
for (int i = 0; i < nums.length; i++) {
, P+ g7 H% v, ]& } for (int j = i + 1; j < nums.length; j++) {# O' D* D. e1 a+ e/ T
if (nums[i] != nums[j]) {7 F( ~. Y8 F+ m
int diff = Math.abs(nums[i] - nums[j]);
, U& N8 c6 @& [& k: {7 O6 L count.put(diff, count.getOrDefault(diff, 0) + 1);
( g# R* i. a. q' Q3 o }
2 m, m3 _" K4 r4 t }3 x% l$ R3 A O3 v
}- P/ b! Y3 c/ t# r
for (var e : count.entrySet()) {$ R4 W1 l7 v0 m% R. J: a1 Z7 Z
if (e.getValue() * 2 < nums.length) {; X7 C N: K" W0 }
continue;
. T* ]; M9 ]1 C" Y' } g, v8 c y }
! W1 f# L6 R3 i q8 ?. m* A int[] result = recoverArray(nums, e.getKey() / 2);
' F5 n3 j$ f8 H! T8 f if (result != null && result.length == nums.length / 2) {- j' ^% F/ S6 ?$ R
return result;
( \. }; F- ]: ^" u }$ J# m0 j! w. f& f
}/ e$ [: @" j9 Z* e
return null;
, v( g+ x2 T* Q4 q% s }
- ^" {. o- W7 n( Q" v: v. K3 K' f1 Z7 G/ N
private int[] recoverArray(int[] nums, int k) {' ]8 U5 b% C( h3 {- c7 _* r5 A
boolean[] found = new boolean[nums.length];
* d- _2 z+ ]0 c, e1 K4 _7 _ List<Integer> result = new ArrayList<>();5 m* c( Y* n1 \
for (int i = 0; i < nums.length; i++) {
3 c8 ?' @9 h" K! i; A. U if (found[i]) {/ Z7 i; ]/ Q/ R* l
continue;# Z# z( b4 [6 b) E
}! _* r& i7 l! X d, @; v7 L
int lower = nums[i];
6 R9 K, B6 Y0 O; b' [1 p int higher = lower + k * 2;, P3 L# L" E! v Q4 y3 [/ I0 ?
int p = bSearch(nums, found, higher, i + 1, nums.length - 1);
4 I9 a t* }- {0 B# r6 q if (nums[p] != higher) {
% T4 j) W2 z6 F- m# ?; r return null;
( ?7 z3 R& V& G4 T. H* |8 j }; }$ o ~) n( T% q* a( I5 d
found[i] = true;
" h) X$ P6 D p | found[p] = true;
' \3 ?0 {" u! F; I& s result.add(lower + k);0 {( U# ]+ @% X4 K9 h
}- s/ e/ A1 ~% }
return result.stream().mapToInt(i -> i).toArray();, k$ h+ V& q- N
}9 [; H: H f9 f. h1 v0 T
1 S% o) c6 ^) V1 E9 w3 Q
// 在 [l, r] 中找到第一个 found = false 的 target1 z$ C {9 y, s( o" h1 E8 h4 s
int bSearch(int[] list, boolean[] found, int target, int l, int r) {
' I1 U) j! c" L, T8 L1 K: h0 V1 I while (l + 1 < r) {
+ e1 ~% X g& y* z4 F( Y9 [# j; f4 X- G int mid = (l + r) / 2;
$ D% B" m) `' D# O, ?( `! f/ O6 F if (list[mid] < target || (list[mid] == target && found[mid])) {
; ]4 B" P" a8 b7 I l = mid;+ R: A B- k n
} else {6 v/ B# W. U3 \+ p+ Y
r = mid;
$ p! A+ p9 e) k3 `! G! T2 r }) Q2 T; Y* v& W, r0 G
}' Y7 h+ d: G# F3 T2 \+ c. M
return list[l] == target && !found[l] ? l : r;# d9 v5 g$ E# J: |
}" z: F: U v& Q8 A# z0 \
} |