登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 Excel 表中某个范围内的单元格】
; L( c( z3 [8 G. t
$ z) r8 F3 z9 T6 ]# A. @( l解题思路! a+ O/ D+ Z- \3 Q2 ~
通过 char 类型的加减法进行坐标转换。; }4 G) _% q |' d1 x8 N b6 G
6 |* n* o( C- H6 }& a( [ d$ K
代码展示
t3 a4 N* f" G1 }7 i$ I' m. W
; o& Z0 R s' k) m: _* \class Solution {
5 Y9 @% L' X# e% }7 l) @% x+ K public List<String> cellsInRange(String s) {
, Z0 g3 O7 e+ s; \ int startX = s.charAt(1) - '1';1 {( D' ?) ^5 i' c
int startY = s.charAt(0) - 'A';: \5 }* [8 @! \. g- W8 ~; j
int endX = s.charAt(4) - '1';
- o" |# E4 U& n5 s$ H- }4 F int endY = s.charAt(3) - 'A';
+ h: i, n7 s) C) f List<String> res = new ArrayList<>();
. d5 d' O, S( B for (int y = startY; y <= endY; y++) {4 ^9 d4 q7 R. L% {* Z) e
for (int x = startX; x <= endX; x++) {
: e$ W6 L' l. F$ C0 ]% S res.add(String.valueOf(new char[]{(char) (y + 'A'), (char) (x + '1')}));
, B, C p& E' a+ b }9 t9 r1 S! p7 j, ?& B
}0 c9 L4 N0 e! {+ G4 U( b
return res;
. e) I8 j- F) g! W7 x }
0 a& c- h! c+ O) |# B% y+ Z}7 H3 ]/ m0 P( I6 X9 m
% V/ I" \5 q! b, i+ m$ y* f7 }; | _
【 NO.2 向数组中追加 K 个整数】
: p! m2 p. p. [/ s/ }, ^4 y5 B2 d3 M k6 Q6 G) U
解题思路' R6 J: S; J6 Q( ~ |! `* I
给原数组排序,然后向有缝隙的位置插入即可。
& b" e% V% f7 @; ~- u) T
- D1 ~% @/ R! O r代码展示2 m, N! f- V( x, o
& m7 Z: l8 z! u5 F0 m5 Z$ ]7 _class Solution {
! ?) d, M; u1 U/ M( @; z6 b- A5 x public long minimalKSum(int[] nums, int k) {
9 Q$ N- D/ f& i' n Arrays.sort(nums);
; S. e; ^3 @7 c4 d/ ]% ^ long res = 0; }; W# [% Q+ O0 e% x( P
int last = 0;6 n7 ]& d$ o; r0 k
for (int num : nums) {8 r8 s. f3 t( w
// (last, num)# g. K/ N3 c1 X, D, [
if (last == num) {
$ R2 q. Y- I" A( T8 D' B2 A9 ^ continue;
. }) r- Z. u6 g& N' F }
7 S% G3 g7 r% q0 i0 s* ?5 s int cnt = Math.min(k, num - last - 1);7 r6 g8 O2 d$ K2 a7 H- `+ Y
k -= cnt;
# Y+ g! L- _- y. C" B, }1 F res += (long) (last + 1 + last + cnt) * cnt / 2;
( S2 a; D# G9 I/ B, c6 I last = num;
" o! k9 E6 c' d, x, N4 L if (k == 0) {
+ L4 N+ B8 u I; P2 b break;
; T9 D4 V+ I8 o- S0 d" r) X }7 F! s7 Q* t* Q! m2 q$ _
}
7 k1 i7 S4 X6 W; I5 i. {, z( a2 y1 S if (k > 0) {
3 d+ A5 W" N- ~& l res += (long) (last + 1 + last + k) * k / 2;
8 \/ |/ x2 ~! M; { }! S* M2 z5 d1 W! N# M$ T0 F8 y- K
return res;; a6 l( A' K _
}" p8 ?+ {" u3 _0 |( {. q, R
}- H& E+ ?. G2 X% o9 U- }9 R/ `7 \# u
9 T4 P8 q- ~( Z- J( s
) D( ^9 \2 W: l5 @7 M' @- ~【 NO.3 根据描述创建二叉树】) c/ O4 T) X" W g# o' M
" F) a0 j& C* C* P. i解题思路
/ x# z9 i8 b5 R$ ?- Y使用两个 Map, 一个记录节点值到节点的映射,一个记录节点到父节点的映射。
! r# z. O* n, Y; Z$ w p+ m3 C
% F0 ^/ g1 \1 h1 f代码展示3 E9 p q# P6 N+ L& R( a3 }
% V, ]7 S# Z2 A, y5 u
class Solution {
0 L8 O+ J1 ? {' Z. B0 Y public TreeNode createBinaryTree(int[][] descriptions) {
, p \* B. d" D3 C+ i Map<Integer, Integer> parent = new HashMap<>();
% s( J5 {2 g D; Y/ e$ r: Y9 c Map<Integer, TreeNode> valueToNode = new HashMap<>();
4 z- i: g& _( u: K for (var desc : descriptions) {/ @! t$ P" Y" R
for (int i = 0; i < 2; i++) {
" y9 A, }0 R3 Y* C8 W+ {: j* ^ if (!valueToNode.containsKey(desc[i])) {
$ `: b" W# N, n+ a( Y" H& b valueToNode.put(desc[i], new TreeNode(desc[i]));
: t6 j+ x/ B" ?( c' q4 G8 ?* e! K3 x }8 @4 k6 i, X- L3 T
}2 {* v5 v+ o6 q2 p& [, D
parent.put(desc[1], desc[0]);7 M( [ ~/ Q* w, S" s W6 ?
if (desc[2] == 1) {
# i2 Z9 r# o3 m& C' _ valueToNode.get(desc[0]).left = valueToNode.get(desc[1]);9 G0 v; I% m1 u$ Y
} else {
& R' p. Z: C. l& ~) ~+ ? valueToNode.get(desc[0]).right = valueToNode.get(desc[1]);& a0 c ]$ Q W
}/ M+ A2 h: f- E) m! @$ p- a% i2 F
}4 u& N) v7 _. I @
int cur = descriptions[0][0];
4 S: {/ S+ M( U" P1 R while (parent.containsKey(cur)) {
$ |- R+ a6 ~0 U v R: |* v7 I& k cur = parent.get(cur);5 s: N X4 g$ F" N
}
/ B# l% P# v7 L6 _: p; J$ s9 Y. _ return valueToNode.get(cur);( [" i9 z, V8 }: k& J6 h
}
, n! \# W! u2 d5 F9 n}
6 E1 h' H- w2 ^% x" E0 j- F. ?
9 d8 p c- X8 K+ P3 j【 NO.4 替换数组中的非互质数】
+ {( E! z; c$ T1 i
7 H9 q1 T$ `1 S, S解题思路+ {$ C1 _2 C- y) m2 T$ C' ?3 w
正着遍历、反着遍历,直到无法再合并为止。详见注释。* i* ?" {; `3 v {! {
, R% y2 ]5 B7 k* l代码展示
- m) f4 I h2 ?2 L! H
. \( l5 e5 D Z: Z/ Sclass Solution {
& f& j9 J* @; U. _ public List<Integer> replaceNonCoprimes(int[] nums) {' F: \% C! y; J% h5 c7 j
List<Integer> list = new ArrayList<>();
) I2 }4 l7 w s/ Y. Z3 s, x for (int num : nums) {! r. Q0 N0 ]& M
list.add(num);6 X+ w5 K$ P2 Z2 @6 d. F
}4 D- \4 D7 k5 }, O9 H
while (true) {2 j p, u4 N# D& r4 J
// 正着遍历,合并一次
" w7 V2 e/ R; z; u7 O1 b9 p1 O List<Integer> merged = merge(list);
* t# i- z: k# D% \ if (list.size() == merged.size()) { // 合并前后长度一致,说明无法再合并,直接返回
" {9 V: Z% Q# [, R# _9 H& e return merged;8 a9 Y; l1 U3 ~0 s5 {* L; X
}9 j# \& S* {6 ]1 ]0 e, T* j5 J& e2 V
// 反着遍历,合并一次7 n4 z! u2 B8 m7 d
list = reverse(merge(reverse(merged)));
+ y* L: ]: T a }/ Y1 s7 R7 g6 I
}
; }/ K- j- K+ h0 i X
+ r, P! x1 c% i1 C; v- y4 y private List<Integer> merge(List<Integer> nums) {
) A, I8 J( O ^ List<Integer> res = new ArrayList<>();4 E5 K' l' {& Q/ B8 S0 @7 M E* b
if (nums.size() == 1) {
) l, q4 z3 I' C# y% f+ y res.add(nums.get(0));+ L) P- b# C/ y8 N/ q3 k
return res;
: I. a6 E1 w5 f }
/ i# I0 p) {! y1 o // 一次合并中,令 i, j 表示相邻的两个元素# w5 ^" }& l7 e& d. w2 o
// 当 nums[i], nums[j] 可合并时,nums[i] = lcm, j++ 即可
& y2 I- _! m: N+ g2 x9 y. n/ I/ o% [ // 最终将结果 add 到 res 中" V6 _' `2 o' n. t
for (int i = 0, j = 1; j < nums.size(); j++) {
4 ?2 t4 O6 h2 R int g = gcd(nums.get(i), nums.get(j));
! f* u1 m2 ^2 n6 {4 h if (g > 1) {
7 k: D. A! v; ^. C, y1 O" F nums.set(i, nums.get(i) / g * nums.get(j));8 V" o2 a$ P0 B9 t
if (j == nums.size() - 1) { C* ?' {6 \) Q! B1 t7 i
res.add(nums.get(i));
' J' r6 @% |/ B7 E' K- l }
0 }* v5 y2 m$ o+ u4 |3 l7 m9 {8 F, x3 ` } else {
( _4 L3 O# f' U- } res.add(nums.get(i));/ C1 t! w! f4 W3 N$ o
i = j;+ @4 U* Q3 O; ~1 j0 Z% f* n
if (j == nums.size() - 1) {
; D$ u# D( I8 ^8 } res.add(nums.get(j));
* \% s M3 P5 E4 Q5 B! _ }6 @' ]) d" b7 s- s
}
7 _: a0 S) |8 }# M& C$ h }
4 V; h. C2 N, D. ?- ^+ C: t0 S) ^ return res;7 z0 J$ z: G$ F
}
$ }9 l. R. o' S$ U6 R1 X1 Y6 ^& n
private List<Integer> reverse(List<Integer> list) {9 r3 y2 ]8 |& M8 [8 E# F
List<Integer> rev = new ArrayList<>();5 @6 ^9 B6 t8 h$ ?
for (int i = list.size() - 1; i >= 0; i--) {
6 A9 m7 b0 D M: e$ _ rev.add(list.get(i));
% t. b# b. X" ~9 S# H }% b) t0 J& @1 Y7 A
return rev;. T l' A! K* W0 l3 ^
}8 p8 T1 U% I$ H5 U
: C1 _8 _9 ] N- Y _& i: n; ^2 b' v" J; T( g. q& u( t2 K4 ?
private int gcd(int a, int b) {
' g2 `& e- u f5 x6 [/ V) o return b == 0 ? a : gcd(b, a % b);. E1 D* Q1 o- }( k+ t
}
! F+ ` d) h5 p. F} |