登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 将字符串拆分为若干长度为 k 的组】- ?3 ^9 @. O- z
解题思路
6 {" M, x$ j6 C3 s# J( C签到题。
6 Q* K5 u0 g- U5 x" Y) h' D/ N" j" q/ e, t1 U) l
代码展示
' X6 L3 Y, P+ g7 M- a$ a! x0 ?* yclass Solution {% X! @, X% R( J: }$ U( I) h
public String[] divideString(String s, int k, char fill) {
( b6 ]" @1 e1 E+ M9 D String[] res = new String[(s.length() + k - 1) / k];: Z' V$ z, L, v# Y
for (int i = 0; i < res.length; i++) {
2 a* O3 l: u3 J! g if (k * i + k <= s.length()) {
1 ^: w7 g7 S9 j8 q" T; |# M res[i] = s.substring(k * i, k * i + k);, ]+ }( D2 y9 l2 s- n5 n7 h
} else {
) S' p7 m' L) u3 f R res[i] = s.substring(k * i) + repeat(fill, k - (s.length() - k * i));; H/ w( n; x8 `0 C) ]
}+ |# R$ l8 E, x( f. X& R
}
: z1 L3 W% }/ L m( I" j return res;
" T, L. ~1 k; _$ n( J }- ?8 Z/ q: ~. [
# M1 N8 X" i/ s
private String repeat(char fill, int i) {5 X! ^, g! Z9 f) s' a. k( L& X
StringBuilder sb = new StringBuilder();
3 B. n; o* D7 E* \- S5 j for (; i > 0; i--) {: l4 [4 H# }/ m% w/ l$ U9 R
sb.append(fill);/ q5 O) z. W' R: U$ N( R7 R9 o) X; L
}
1 m% ~5 U. U0 [* `0 y$ S; s1 K return sb.toString();- U* T) B8 k6 U
}' O5 I; W* W9 E- `& U5 E
}
+ c% B0 g7 p w' v! B8 d
4 t# j( G/ O, ^& w/ a9 a! h【 NO.2 得到目标值的最少行动次数】
- `' y+ \5 r1 Y解题思路+ x+ V% A/ u: @
逆序贪心,优先用除法。" ?2 l$ V& L l2 A2 w7 w0 P
2 ^) H& s+ J7 N+ R$ ?2 L* k& _9 d代码展示2 k/ h! S% `: B6 |. @8 `, T& J2 Y* s
class Solution {
P1 n8 F, |- T6 X& n7 H' j ` public int minMoves(int target, int maxDoubles) {) ?9 m8 p& b1 F& L( W
if (target == 1) {
% G9 ?! D1 D! Q return 0;
. R# _/ @# f8 w& d K7 `+ K' `( L6 H }8 G, N* T& }' f ^# C) g
if (maxDoubles == 0) {
7 m( U. F& G9 A" S return target - 1;
+ O) }) M+ b3 ?$ P }' k2 @. z6 A* z( B% { [6 ^: f8 ~
if (target % 2 == 1) {
, n, @" E7 l4 o/ ?8 l M return minMoves(target - 1, maxDoubles) + 1;
( j% t( M) k4 j" I, _( z$ U: q* q }
% f% m M6 q5 Y6 f" i+ y5 o return minMoves(target / 2, maxDoubles - 1) + 1;. H8 z7 o$ w$ W/ f" t) t* r$ J" J
}
, {8 L( s$ H1 N3 p1 J& D0 o}1 |/ n+ a& R* l4 Y( k0 S
& b# r, f9 t" C0 P. W: r/ t, g【 NO.3 解决智力问题】1 a: K( V7 k5 \0 q) H
解题思路
, B. I3 o7 S) Q动态规划,定义状态 f[i] 表示解决问题 i 时,前 i 个问题最多得到的分数$ @& X+ ?0 w9 w& e' F$ m8 H F
; O) Q" j8 v/ d- n& Q则有状态转移方程 f[i] = max(f[j]) + score[i], 其中 j 满足 forbid[j] + j < i
8 B; g5 H# c: ^2 s8 L% f* T# `0 U. H, U% M8 m. K4 F2 ~2 j& T& N' u
使用 TreeMap 维护 forbid[j] + j 即可6 n: N4 ~6 V; N& C# ]
5 R6 y+ e( P( e% H4 c代码展示/ r; m! Z- F' t/ J7 g* d
class Solution {
- I) y3 D0 j, ~ public long mostPoints(int[][] questions) {
+ A* s! ~/ M8 b) D long[] f = new long[questions.length];
/ R: i: D. h8 M f[0] = questions[0][0];
9 e& j" i* Q2 d% w; O3 `; F TreeMap<Integer, Long> cand = new TreeMap<>();3 F4 {- ?+ N$ }* G# _
cand.put(questions[0][1], f[0]);3 ~! F7 Q& o P8 \1 e0 F+ ~
long max = 0;$ X1 E' u% |2 Y
for (int i = 1; i < f.length; i++) {
) [* w* \; K8 ^ while (!cand.isEmpty() && cand.firstKey() < i) {, y2 R8 w9 L) E+ z, s
var e = cand.pollFirstEntry();2 {, z1 I9 @3 H6 W' p- m# K
max = Math.max(max, e.getValue());
! p$ i7 [' o+ S1 G5 B }
& N D k- X& D. f6 ` f[i] = questions[i][0] + max;5 u0 @$ m% @# h! w( y
int key = questions[i][1] + i;6 q2 c: \, `+ f4 o* D
cand.put(key, Math.max(cand.getOrDefault(key, 0L), f[i]));/ k& `: u: E* v: w4 ~2 B! w& [
}
: _" A! W, i$ a% s7 x$ J' ? return Arrays.stream(f).max().getAsLong();2 }# Y. u. n) u( l; U$ n+ w
}0 ^; R8 Y! d3 N
}
2 O4 g9 p8 B: Q/ x) o
- o0 V0 p5 m* F4 a0 w【 NO.4 同时运行 N 台电脑的最长时间】' @0 ?) Z6 w% L. J2 x/ W
解题思路, E7 f. ~( H% b* Y
二分答案,详见注释。
: F( W- i& |' K8 K `! o5 `0 I& I# w/ W1 i
: r3 C' r4 t6 j6 G* j. {代码展示
# {" x9 F" v- m) P( Lclass Solution {
. _ w6 }2 y/ n1 Y& L# T ` public long maxRunTime(int n, int[] batteries) {
% j2 ]* C8 S1 `: c6 L' [& G long l = 1, r = Arrays.stream(batteries).mapToLong(i -> i).sum() / n;
# M" I& U' Z! R/ z1 j" t" R: r while (l + 1 < r) {; h) s+ u) K* A1 I
long mid = (l + r) / 2;3 t4 W" h2 t& l5 U0 L9 B7 ~* g. H
if (check(n, batteries, mid)) {
6 N( s) c+ n. q% s: j l = mid;
, g1 R3 } V" r$ Z7 Y' c) x } else {/ U. q8 }: b2 k
r = mid;
5 Y! W+ r1 e" k. ?2 y9 o7 m3 x0 J } T1 o, M" H( E3 P
}# J: |! p3 D, }5 D
return check(n, batteries, r) ? r : l;: j5 _, M4 j/ i0 E
}
" I' Y/ \! K; D% L7 Y" U
6 Q" @# ^0 r! l/ y3 y6 P // 判断电池能否供给 n 台电脑使用 time 分钟
& T# h# ~8 b0 z. h9 q+ Z) U // 相当于每块电池最多使用 time 分钟
: g9 c/ U7 |! p9 h* c; o // 如果一块电池容量小于 time 分钟,那么它需要和其他电池拼一起才能组成 time 分钟
* ]3 C$ c2 i! ~2 ]: D // 如果一块电池容量多于 time 分钟,那么可以认为它将被浪费,可以认为这个电池容量只有 time 分钟
. a1 A5 K* [8 g# y8 @! T; `5 T // 因为换电池是不消耗时间的,所以只需检查电池容量之和是否达到了 time * n 即可
% Z: H* X% S4 `( j X private boolean check(int n, int[] batteries, long time) {
( m+ E2 W+ B" c2 V return Arrays.stream(batteries).mapToLong(i -> Math.min((long) i, time)).sum() >= n * time;1 n+ {. I) u9 s4 @
}2 H0 O' H. G \, n1 ?# Z- N
}. K- |2 R) p9 m- }3 r
|