登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 Excel 表中某个范围内的单元格】8 c( _. O" ]6 I/ n# B$ f
& o8 \8 s1 p% ?7 w8 l4 @% j( s$ v- G
解题思路
2 \3 Z5 W& m7 F2 z0 z4 _通过 char 类型的加减法进行坐标转换。
* [; e$ [& l# [, W
: X, P N6 r3 t. F, f1 |代码展示3 R# W9 I) y4 ^% m9 u- u
( k" X. v* m' c# J$ L+ K" a
class Solution { F E' ~. h6 ~: y! {/ E
public List<String> cellsInRange(String s) {
y; \& z/ w7 y int startX = s.charAt(1) - '1';
$ x* T- v2 Y' X3 j# B& q( f* t2 T( a int startY = s.charAt(0) - 'A';
0 I4 V8 Y% x+ w2 R0 Q( s int endX = s.charAt(4) - '1';, ?0 g6 S* l& k# N, V
int endY = s.charAt(3) - 'A';
( L$ }+ `3 R! l1 Z List<String> res = new ArrayList<>();0 J/ B4 B) W6 ]- h u
for (int y = startY; y <= endY; y++) {: | I+ o. u: ?6 O6 E
for (int x = startX; x <= endX; x++) {
- _/ y4 a0 J& T' a! r' q res.add(String.valueOf(new char[]{(char) (y + 'A'), (char) (x + '1')}));, l" |) k3 H$ B- C" B* O$ ^
}6 ~% v# z( X: Z3 l: i6 q
}7 L7 Q) i% Q# X% I. C5 b2 x( W
return res;
1 S$ u5 B$ F% q }
1 Q2 G+ O- b& }" G1 t/ i}- K. I2 s: I; a) @
" [* m& i( g6 B0 L+ p% t+ b& D
$ F- P4 u% c+ r' |2 t) V. w【 NO.2 向数组中追加 K 个整数】
* n i. j: h; i' e9 ]+ l
3 J& m1 c9 M! [& s8 _& Z解题思路/ w8 b" A2 l3 Z4 C; j
给原数组排序,然后向有缝隙的位置插入即可。
- Y; Y9 r% ^8 D( T2 x& K4 ~6 m9 A/ Y& W0 B1 b! B
代码展示
3 E; G: l: y8 h9 a' K+ O) K
" f% j% O4 W, q5 |$ Cclass Solution {5 w0 n$ r) s9 e: Q) X& }
public long minimalKSum(int[] nums, int k) {
- J$ N% D: [: u Arrays.sort(nums);0 B. q8 N3 ~( ]! Q& D$ p3 x
long res = 0;$ c( p0 o. p- K4 N# @9 P# w6 {+ s
int last = 0;
% X. X. m* A: h G8 N! P* v for (int num : nums) {
$ S( @9 j& @6 z( k+ a% q // (last, num)# r) Z% Q4 o" ]
if (last == num) {, [) d' S3 j* `9 g, N/ U
continue;0 q+ Y, G8 A6 l' d/ @! v
}$ o m6 s% Z/ B% `: r+ a* u
int cnt = Math.min(k, num - last - 1);
8 P: a7 f: d% {! t9 W1 Y2 C k -= cnt;0 l# \% u2 Q& k w# y: N4 {
res += (long) (last + 1 + last + cnt) * cnt / 2;% l4 n9 v+ B4 H6 g2 o3 |/ ]
last = num;# @8 E- U8 ?1 z' V& K9 k
if (k == 0) {
. i( s0 V! y3 X break;
& o' K2 @$ q- I; d }
$ p# c# ?4 Q3 U' A }3 G: J: H4 W- |1 m- c! r
if (k > 0) {
# H4 [; t/ B9 Z M5 T. B res += (long) (last + 1 + last + k) * k / 2;
7 ?, F8 Y( a7 W }
' Q6 P2 y' a' m% Q return res;8 M: }4 {: Z& Z) o8 s% D F
}
/ B4 { Q& e! p% a B- y}) z# r3 J1 L, }& I1 s$ @
4 V% Q7 \6 s) z) {' Q% d
6 E9 @1 c" P7 I9 P# F+ Z( z c【 NO.3 根据描述创建二叉树】. H$ s& j" g7 {; q
) Z" X& s+ [( R- Q# H+ D- k4 [
解题思路
# ^& d& ^' G8 v使用两个 Map, 一个记录节点值到节点的映射,一个记录节点到父节点的映射。2 @, v0 f3 S7 F: I0 e/ j2 i
' c0 X7 B4 W) \; I. {0 \# B3 |$ L
代码展示2 t9 ^8 |3 p2 R& ]
7 `1 |, ~# [. Cclass Solution {
1 _8 ~; x6 o$ b' E8 }8 W. g: H public TreeNode createBinaryTree(int[][] descriptions) { b" C: F6 l' c
Map<Integer, Integer> parent = new HashMap<>();* i5 g0 p; t3 n' Z. f
Map<Integer, TreeNode> valueToNode = new HashMap<>();
3 i5 {+ B7 A9 s+ E5 N, i2 h for (var desc : descriptions) {+ A9 l% C) a# { L4 P
for (int i = 0; i < 2; i++) {
" p. r5 W/ n- n7 A. q if (!valueToNode.containsKey(desc[i])) {
; [. A4 h0 W/ c$ B/ t valueToNode.put(desc[i], new TreeNode(desc[i]));, p0 H9 V" H2 @/ R' c
}
9 Z- i, P8 h3 S! g) r( M }
& q' o9 X! N" h( B3 J- x1 t parent.put(desc[1], desc[0]);
3 z, J/ _& a5 h& ?8 Y if (desc[2] == 1) {+ ~% P3 P) x) q) p3 e
valueToNode.get(desc[0]).left = valueToNode.get(desc[1]);
$ t: A1 `" Q) c* g( H8 |+ a$ u } else {0 n' `" X8 k. G4 ]# a
valueToNode.get(desc[0]).right = valueToNode.get(desc[1]);
' Y: n$ L- O: j8 L3 V0 I1 B! ^' Q }
8 J+ A& L+ A' W6 g/ T* [8 D }( X* _2 Q7 x$ A; q) L
int cur = descriptions[0][0];$ g( b `8 H8 [+ N1 _- W8 j, B
while (parent.containsKey(cur)) {# E. B: j0 B0 ~9 T: h$ H9 ?3 V5 ^
cur = parent.get(cur);* W8 ~ A; Q) v
}
% @0 k' ~8 M* y* [ return valueToNode.get(cur);
+ W( z; d: G) |5 N/ g }: W: L0 h4 j, g9 v" v C) V
}) c7 L \# ~2 ?' t( C. s
% q! Q% T: h0 D: E* B4 @& O【 NO.4 替换数组中的非互质数】0 B' l3 s+ w. w- w3 k" }
# _: K, Q8 X- w8 k8 j1 ~. N2 {
解题思路
, s' V8 U" X; J" Y5 I" j$ B正着遍历、反着遍历,直到无法再合并为止。详见注释。
& l8 t8 U$ d3 V: E/ `; K4 V/ R
+ o6 k) D8 \0 I代码展示
1 P5 F6 J [2 h5 h' r4 \1 M5 p2 f# ` g( P! o9 A! T6 L
class Solution {& @3 Q3 \ N/ Q1 }7 L- Q& x) u
public List<Integer> replaceNonCoprimes(int[] nums) {$ P1 Q, g7 P7 F& Z5 a7 e ~9 p
List<Integer> list = new ArrayList<>();: Y. N7 `9 w. u2 Z& n$ Z0 V& N
for (int num : nums) {
5 v0 {2 \, J2 o! z% _ list.add(num);
3 A& w3 E. P w }; m9 f$ c3 b1 `( o4 L
while (true) {
) x1 c7 B# \$ N S. L3 H6 o // 正着遍历,合并一次% o o& G( D1 d% H$ d8 Q V
List<Integer> merged = merge(list);
+ t- H6 W K2 r$ v* H if (list.size() == merged.size()) { // 合并前后长度一致,说明无法再合并,直接返回
0 |! v, J% l( f8 K6 s return merged;6 z) K+ a$ }' {6 a' l4 Q/ z3 i% g) @
}- c- S2 t* o# R: ]9 h5 {5 H
// 反着遍历,合并一次
# E$ ?. E8 E) n5 U) w( a. u* D list = reverse(merge(reverse(merged)));
" Z& J. w% L; i! [; d2 T }! h+ n. U1 l- r) V& s$ [1 ] P- r
}6 L5 P* H$ m. Y; @/ Y
9 @# R/ Y' s4 z3 Q% q; W& K- R private List<Integer> merge(List<Integer> nums) {- ]' ?8 l1 E7 P1 f# P% ` c
List<Integer> res = new ArrayList<>(); {, S5 H# I& g5 W1 |' L% I
if (nums.size() == 1) {
5 U8 ]3 ^" P3 m res.add(nums.get(0));+ A. q& S" V: R3 V; M( F1 [4 s
return res;
0 ]# [+ @, {& @ }/ z% y; y* p! v) k/ t
// 一次合并中,令 i, j 表示相邻的两个元素! p# ~. m, e$ M. A( d
// 当 nums[i], nums[j] 可合并时,nums[i] = lcm, j++ 即可. G& t3 U- ?$ Z, U) u' \: L! |
// 最终将结果 add 到 res 中
& \1 j; ~ E- B) ?, J for (int i = 0, j = 1; j < nums.size(); j++) {
2 e9 _7 o( d1 U2 R* q int g = gcd(nums.get(i), nums.get(j));
5 s, G: ?9 c' S1 Q3 J if (g > 1) {
$ @- q% C- y( u z nums.set(i, nums.get(i) / g * nums.get(j));. I- i9 t+ m1 N
if (j == nums.size() - 1) {- u3 X; \; k9 W1 K; h% V2 |* s
res.add(nums.get(i));
$ u2 c6 A4 f' J; M }
+ J, r2 d: V% J& O* G } else {
: I- o+ q* o- f4 n$ ? res.add(nums.get(i));
|! u) ^, E- n& y1 Y i = j;" u/ V: }' u: U7 L& }& M* @
if (j == nums.size() - 1) {8 I7 V9 s! t) V( w
res.add(nums.get(j));; I0 U! j" m' P! m4 r. N4 D8 }/ u
}% {; W4 U8 c+ a5 {
}( o) F. y4 u/ z7 b) v4 H
}
) f- ^1 ]& o) K* p. O! F- b! j/ J" z return res;
4 m9 O3 |! B+ C2 G" g }4 B1 z: p1 H8 f5 D# Q5 G
/ c) F2 ]* G5 v5 S0 Z7 q/ |8 u private List<Integer> reverse(List<Integer> list) {
) T: t& v6 [" d9 V% p List<Integer> rev = new ArrayList<>();8 }+ W& F& A' v) O4 K5 d
for (int i = list.size() - 1; i >= 0; i--) {
O# u, B& K: T" B9 A: b; ? rev.add(list.get(i));
$ i% T. `1 _3 N4 R }& J+ w- C8 `" i1 k4 x Z. b( f. ]
return rev;% u) ]: ]" g3 f7 ?8 d+ Q+ p/ j" T
}
! [8 B% z2 y7 h/ ~7 g
" f; k3 \! d7 E% D8 x5 a6 j1 g- p" _$ |2 m; U; p; f: M
private int gcd(int a, int b) {
) `) ]4 l) ]4 c2 T return b == 0 ? a : gcd(b, a % b);4 L, Y9 `% J: T1 K
}( n; |6 O( q+ N
} |