登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 转化时间需要的最少操作数】
+ Q! d$ O, Z* p/ G$ u3 l# _' @! h# c% r* Z9 U L) B4 ^) u
解题思路1 X" J; Q* n4 E% O
将时间转换为分钟数更有利于算术运算。, J, a& l! N' B4 e" ?3 J
9 f: i, X2 U; F2 M代码展示4 F* u) G5 Y7 r' ~
; _) k9 Z& C7 S, r2 j: d I; Oclass Solution {+ W6 W! j; Q0 Y/ m: }
public int convertTime(String current, String correct) {
! a% T! `& A% v int cur = toMinutes(current);/ b6 i4 n" I1 h. y
int cor = toMinutes(correct);
- b1 }3 s+ m; ]+ Z if (cor < cur) { // 第二天,将 cor 加 24 小时
1 L# R3 o! x) ]) D$ u! M/ u cor += 24 * 60;
: b! _) @2 ^3 w% F6 W6 @ @ }
% Z. P( x' m+ @7 `- } int diff = cor - cur;5 K9 _& {" _; T' H
int cnt60 = diff / 60;" _5 ?8 i7 }) X& l8 U# T& d
diff %= 60;
, g% a2 ]: q* L# e int cnt15 = diff / 15;
+ R4 _' x4 [+ ^ c diff %= 15;
1 D$ J' x: c& }0 I int cnt5 = diff / 5;
, O& |2 J/ n2 n) A& w& u! }5 | diff %= 5;1 u5 r F: O7 a" p
return cnt60 + cnt15 + cnt5 + diff;) s' j; u2 Y# R: N
}
& V* J9 H, V' l Y1 T7 Y A8 B J8 y9 T( A# } ~
private int toMinutes(String time) {
2 |# e/ R" Z( g4 _ t, z, r* s2 b return Integer.parseInt(time.substring(0, 2)) * 60 + Integer.parseInt(time.substring(3));
|) n5 i- J1 e4 N4 K J }8 y3 o, p- {6 E1 b! T( P% b
}
% E% Q( x* _. a! G5 s$ c# k7 x5 j0 F |7 |2 U, G, v
( {! M) \' _0 {! t3 c! N( i0 y
【 NO.2 找出输掉零场或一场比赛的玩家】
2 W& P w& P$ G0 q' w; z5 `
, l8 ]$ z2 P# h7 Q! p3 ?2 R解题思路
$ Z) j* }# X5 j |, ?使用一个 Map 维护每个玩家输掉了几场比赛即可。
; g4 A+ k5 Z) J' @/ E* S) _6 T
% Z3 t( K+ u/ \- f代码展示
# q$ i$ ]; ~9 |) O- p; C- p
9 L9 B- V5 u5 s7 l1 Iclass Solution {
1 ?' a+ \) i0 Q) t+ c0 O public List<List<Integer>> findWinners(int[][] matches) {
$ x; h; C2 J% U. H. R+ g Map<Integer, Integer> loseCount = new HashMap<>();
* r& Z s# u9 z2 Z/ |; ] for (var m : matches) {
2 F- L6 o8 c; s( r loseCount.put(m[1], loseCount.getOrDefault(m[1], 0) + 1);
1 W" p" s0 w2 w' k* @ }
2 A! n o7 V m1 Z5 B List<Integer> res1 = new ArrayList<>();
) I8 E) {/ m* n8 b7 | List<Integer> res2 = new ArrayList<>();7 z0 d* Y2 K" c% e% f; j
for (var m : matches) {8 S& F* r- W+ E6 |
if (!loseCount.containsKey(m[0])) {
& O d: S# N+ U* E6 s8 G+ S/ a: u( r# ^ res1.add(m[0]);# Q, O4 b8 p' M$ H9 ]
loseCount.put(m[0], 2); // avoid duplicates
1 {9 J2 H y- p }, {' ]7 b! t' T n& j- ^
if (loseCount.getOrDefault(m[1], 0) == 1) {
& g1 z. b4 b0 R. ^9 ~ res2.add(m[1]);9 f$ w5 r# K, i( O' I
loseCount.put(m[1], 2); // avoid duplicates
' v! }+ ~9 x2 f4 B1 W& o' N4 A9 h7 a }4 e3 |9 G) |: F2 b6 _
}5 ]6 Z& P9 k+ X( l# A" ]
Collections.sort(res1);
5 H0 M2 q7 h- _ Collections.sort(res2);" C+ l/ d" ]+ J* O4 ^
return List.of(res1, res2);
* f+ O- [1 W7 R$ m7 X+ ], ] }$ @3 K6 V9 |; [& N+ g
}2 S, i; |2 x# I1 T
% w/ P. c* }, m- Y }- S8 P# Y8 }5 u4 K5 {* m" V6 `* u
【 NO.3 每个小孩最多能分到多少糖果】
) u/ j0 B |+ E: ~/ Q
: F: r( U6 Z1 |! | ~/ X解题思路
9 H# m8 G6 o6 a% a: G典型的二分答案题目。
! A# l* ^( Z2 J: ]& T7 l! V( i' Y$ C( I0 o5 V, h- e4 F/ N2 K: @- q
代码展示 Z3 t8 s, I0 j4 o. ]9 o
* G3 s" O$ q2 \/ @0 o
+ w6 q! M9 w, o
class Solution {3 r( a/ H0 I: a/ {8 {" t
public int maximumCandies(int[] candies, long k) {2 H( P( u; F/ B, W
int l = 0, r = Arrays.stream(candies).max().getAsInt();) Y3 k! f# q2 A. q+ e0 w
while (l + 1 < r) {
5 F: d) v5 \: }- y int mid = (l + r) / 2;8 m) I6 w" F% G- e5 J) q7 v: y* P
if (check(mid, candies, k)) {% u( e$ F& m1 Z& {) o# R
l = mid;* N: w* P j9 U! y" ?
} else {
) ]/ Z$ H! _9 ?9 \: Q2 F- N y r = mid;
3 `$ O6 q: X3 L }
2 D' R% n& H) V& I }8 g% x) ?' ` U+ R( {
return check(r, candies, k) ? r : l;2 ~! G3 [' c; u" ?) D
}
& \1 X0 ?1 D$ y5 A4 _ n; e) L( }3 E( V( e( W+ u0 a1 P
private boolean check(int r, int[] candies, long k) {; [% s) h8 x" ?5 X
for (int c : candies) {
( @" _4 r* t6 w0 } J9 a7 i k -= c / r;+ p1 q) b% ~+ w3 t
}
9 N& i2 @) ?& ^$ H+ e4 W7 k( K return k <= 0;
6 K# n3 o- C* [# x2 J7 b) A9 m1 G }4 F) n% Z- F& F7 ^9 l- _3 t* ]9 r+ _
}+ w" s# j, [0 H1 t2 y
. p& u2 Q4 R- c* H% D- n
+ K2 B/ ?- ~% J' y+ W【 NO.4 加密解密字符串】
6 O+ M# e" Z6 e8 P
; C/ s5 Z3 S3 s9 _8 q解题思路
0 y G" p$ W' U8 R# U! E( t6 o使用 Map 储存 keys 和 values 的映射,即可完成加密。
+ L c! U1 l7 w
# e3 a0 \% m' K解密需要借助 Trie 树判断当前解密的字符串分支 (因为一个密文可能对应多种明文) 是否属于 dictionary
+ f* x1 Y7 [5 K6 J! r0 | R
3 \7 j7 i+ m( i o6 }代码展示( u3 T [# T4 S1 Q4 C
8 i7 x6 ]7 e3 A! z; z
class Encrypter {
% Q8 L. o& u8 z/ G
# v! }% |1 L3 t1 k( q char[] keys; k3 J. F" }1 f0 \
String[] values;
: l+ F3 z3 Z2 d( ~% W String[] dictionary;
% e2 q x- U/ y6 o0 n9 z
# ~4 ^& X; H3 y! W String[] keyToVal;
- v* m: l! s& C, Y+ f( V Map<String, List<Character>> valToKey;
X# q0 v+ H S' F9 h5 x Trie dictTrie;' @2 `- |9 Y& f; a5 b4 U
4 | ^2 A i- Y7 `' g U0 P
static class Trie {
) i& P- Z" X4 j" Q0 V' i public Trie() {
' e, ^1 J1 @6 m# f* t8 {- h root = new Trie.Node();8 V1 G0 e. f: w L& ]0 T5 r) \
}
5 r. ]8 d% N6 r0 R
* w0 ?* t i3 P( [5 [3 X public void add(String word) {6 T2 H& q, i/ j1 v
Trie.Node node = root;
# N. q5 X( B5 f/ s0 X for (var i : word.toCharArray()) {
( V& q3 U$ Q+ _4 k7 f if (!node.children.containsKey(i)) {
' S, ?6 G6 Z4 i( `5 m$ _7 r+ K node.children.put(i, new Trie.Node());
/ Z* x1 Y4 L( S; J! [8 R }
% p9 F/ U# O" T+ X$ [3 g$ U& C node = node.children.get(i);
1 e a7 @. R8 d2 X( I, @9 Q% ~3 G }
3 a) Z3 e: P3 M( M5 F r node.isWord = true;0 O$ E; P3 S; E
}
- D& e8 e3 c$ |' m% d, w- y. ?( e% b2 s( @
public boolean containsWord(String word) {
- A# c3 J& o+ _. Y Trie.Node node = root;, \1 F) F v7 v) v5 j" K& O
for (var i : word.toCharArray()) {5 B O- ]4 U3 \, F$ m) P' y S1 F
if (!node.children.containsKey(i)) {* b2 G' H/ t5 |; f
return false;
/ W- B' {, d- L# q }
; c8 p) K: v4 A3 ~! R& e# } node = node.children.get(i);9 A2 [* M- W& P0 Y0 H1 K; L2 Z
}6 m$ ]( [% t) X
return node.isWord;
' z6 l& l+ k! v& g% X" L+ i' {3 d }& J9 Y3 l. k9 Y8 D D, o% [7 `+ l" T
" f) N6 e/ w0 o, h8 b2 G, \( u7 d
public final Trie.Node root;7 ?+ q/ d9 j# Z
2 e6 T7 _; b) s# a static class Node {
2 Y0 G$ a+ x- a$ z, K! k' J1 h& t boolean isWord;, s- ~; O' C5 q- i% Q+ `6 J2 q
Map<Character, Trie.Node> children;# C5 `: K5 g9 ?0 {! I
7 h' D( h" X9 } [6 c. w6 r$ x
public Node() { t, R! S8 r3 \
this.isWord = false;
; E1 z) c2 w* ?1 B3 G: R% N8 _1 } this.children = new HashMap<>();
( {* x! G9 h6 n- d6 z }
3 m0 J6 h" j- k$ ~! s }
) ?! i( q; u& \; I! j }3 J- r+ i; ]- ^
1 G$ |( _4 i+ s- g; N public Encrypter(char[] keys, String[] values, String[] dictionary) {# V' w4 Y/ R. a
this.keys = keys;
) n7 C @* ? D: Z9 ^' s this.values = values;6 n8 w. Y$ I7 N, R
this.dictionary = dictionary;/ o% ~( U- T/ l
keyToVal = new String[26];
3 t" |+ V8 q" Q; V0 w valToKey = new HashMap<>();) U& A5 q1 q2 l5 ?) i
for (int i = 0; i < keys.length; i++) {
2 p6 T! ? `' o; ]" q; c keyToVal[keys[i] - 'a'] = values[i];6 `$ C& a& z+ o4 \8 u, S3 {
if (!valToKey.containsKey(values[i])) {+ \6 x- s+ k3 O9 V' B1 A9 ?
valToKey.put(values[i], new ArrayList<>());- S0 l2 f' A2 `5 \: k
}" E% ]! H: y. V! ?/ f: Q
valToKey.get(values[i]).add(keys[i]);
. }7 K+ Z' _0 X& g$ k }
$ t/ u! w+ Q! B( Q4 K: I& H( N% \ dictTrie = new Trie();
$ b0 \& w* p! s: Q3 x6 W: C for (String s : dictionary) {5 ?) f4 R% u! N. K; r# H! ]
dictTrie.add(s);
- Z7 V9 S: y( ?3 R- z$ c8 X V& X }
5 t$ _1 ]& P/ Q3 ?. P }% h0 P9 Q& E* I( U7 x! ?
$ C z+ }: [- [, ?3 V
public String encrypt(String word1) {( f, i9 h9 a% c" i4 Z4 y% b7 v( W
StringBuilder builder = new StringBuilder();
2 ?5 B1 Y; @+ ^0 l, s1 z: U for (int i = 0; i < word1.length(); i++) {3 L; M1 r! z9 {% }
builder.append(keyToVal[word1.charAt(i) - 'a']); E. x: v! o6 M& s
}
. Z& a# Q1 Q% ] return builder.toString();
0 F/ B9 _( e, e9 ^3 @" x# a }
* `0 U# a8 d1 v4 |# H; E D' k8 f% W% H# e) e6 }1 r. I
public int decrypt(String word2) {
3 z6 v9 J9 x* J3 y$ c2 X return decrypt(word2, dictTrie.root);1 v* X- z+ i G* d! a
}
+ }- @, ^3 m: h# A7 F
8 G1 r1 K% c w- ~( R4 ]1 C final private List<Character> emptyList = new ArrayList<>();' W9 V9 d. a6 z) @9 ^" @
% p7 O% B0 w& x; @7 g+ K" g% @8 u
private int decrypt(String word2, Trie.Node node) {
( ~" P: f3 L0 U G2 E if (word2.length() == 0) {
1 A; ]* h# z. i7 k return node.isWord ? 1 : 0;
4 }8 o' `$ a5 Z6 ~5 i% P. X }: c( @! t" T. J6 O5 \( F6 j, G
if (!valToKey.containsKey(word2.substring(0, 2))) {
# ~% X$ ]- U9 c# T6 b return 0;& n+ o1 O2 p8 K# K
}/ [* I D' w2 T9 N: \; f! g
var cand = valToKey.get(word2.substring(0, 2));* |% U8 Q9 ~* S/ J$ p
int res = 0;/ }% T- O, f1 I$ u6 I
for (var c : cand) {
! x2 m2 g, h; y4 F* m9 S if (node.children.containsKey(c)) {9 R X- a) A8 L4 x5 o
res += decrypt(word2.substring(2), node.children.get(c));9 K+ X r, @& g) e0 C, h6 I
}
7 d2 t/ \* `4 ^: `8 ` }# v' G% W6 I# F/ F, D
return res;% j+ u- n z! K& c6 T
}
" |. Y+ F& U9 B2 O s} |