登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 转化时间需要的最少操作数】! D' n6 Z5 ?6 D$ v
9 g9 `. w) I. i2 i) g+ u解题思路$ K5 Z' B) G$ O) ^% Y
将时间转换为分钟数更有利于算术运算。
2 f' P* E& O' Z0 T- M! i# K9 C: \- X. ?; [( U
代码展示# t% C, P8 z; C: G1 X
3 [6 e. S1 }, T9 H4 B7 h8 p, Dclass Solution {
6 t6 F4 M3 r1 [) J+ S& Y6 e+ B public int convertTime(String current, String correct) {( M: i& y8 W9 z u
int cur = toMinutes(current);3 W) Q Q& a2 ?, U+ P' h
int cor = toMinutes(correct);
0 ^- D' g0 X9 }9 d, y if (cor < cur) { // 第二天,将 cor 加 24 小时 ?4 N' h: p/ Q, n1 W7 v" q
cor += 24 * 60;
/ w' ]& M& E( K& A9 R8 L! q9 L1 G }5 c+ ?6 X F& d, _. m& H
int diff = cor - cur;1 f) s) D1 S2 i' o
int cnt60 = diff / 60;/ I [: U( [/ q+ L2 _
diff %= 60;
0 |. R4 |% q3 F! o1 ] int cnt15 = diff / 15;
& G. X( \5 d! V! M( v diff %= 15;
, _6 F. @) u: D int cnt5 = diff / 5;. m- ]2 C/ K6 q& d2 O9 |
diff %= 5;4 w, o, N. P4 F. x
return cnt60 + cnt15 + cnt5 + diff;
' X6 p: w% ?/ [* O8 l9 K4 r }3 i- t2 ?5 M( h& N! q3 b
" }2 c( {/ \! P+ V private int toMinutes(String time) {
$ g8 g+ u, k7 X* X" p; E return Integer.parseInt(time.substring(0, 2)) * 60 + Integer.parseInt(time.substring(3));3 [1 f: L' z0 B7 q) {0 }: N
}9 e& v L( C9 X
}
, d( Y2 {9 \) b0 |
: ~$ T3 z0 Q* h! n* d9 U* h! Z
4 V) z( G8 k) c$ Z C7 F【 NO.2 找出输掉零场或一场比赛的玩家】
5 P F. i; m4 _. e" ^; I4 E/ H* E. m& `) ?
解题思路
* ~" u/ w+ V0 Y! O+ a6 S P使用一个 Map 维护每个玩家输掉了几场比赛即可。9 I' Y% _# a$ k1 `
L5 q P" |: S! b代码展示
1 d, [, P5 x* {4 ]5 K& p- F& _. {
, U+ h* R5 e7 K1 aclass Solution {
, E' H$ T+ n/ F public List<List<Integer>> findWinners(int[][] matches) {
" ^# m% P3 n3 y7 Y$ v Map<Integer, Integer> loseCount = new HashMap<>();7 w& i( d0 K* e; @3 d' S M
for (var m : matches) {
r% {0 h. @1 T3 C# ]2 ?9 g8 c loseCount.put(m[1], loseCount.getOrDefault(m[1], 0) + 1);
+ P) `2 y3 b O! h3 ~ }7 [* w+ h( z5 [6 u
List<Integer> res1 = new ArrayList<>();* |. r% s1 Z `! L
List<Integer> res2 = new ArrayList<>();
, U/ j- E: M( S* y- X for (var m : matches) {
5 x# Z5 F& T9 Z( J4 U7 x3 O if (!loseCount.containsKey(m[0])) {( ^; E! z7 s# ]; J* a9 j7 J
res1.add(m[0]);
( Z6 p2 Q. R( P& x* b, V; u loseCount.put(m[0], 2); // avoid duplicates
- v8 a6 Q L ^, F3 l }
8 z8 q' T) s% N/ v if (loseCount.getOrDefault(m[1], 0) == 1) {6 {+ g$ g0 a& S, M" A, ]
res2.add(m[1]);1 S, _. }- a3 K: n; @
loseCount.put(m[1], 2); // avoid duplicates7 N: x. ~ J! g+ V
}
9 ]1 q' u$ E4 l4 K }2 {6 a, _$ w' A8 e, X
Collections.sort(res1);
5 P. T& c$ h/ T1 |7 X/ z$ P, P+ @ Collections.sort(res2);
3 n+ e. R7 k- O0 X: u% l3 [ return List.of(res1, res2);
. Q3 K4 g% l; W }
/ S9 m0 p6 c1 {3 J} h: w5 v" u& r- o0 ^
$ T7 _" ~: L' C5 b) o- g0 ~# n& X8 T
& A; s5 e" \3 Y. Z6 u" H【 NO.3 每个小孩最多能分到多少糖果】
7 E( |+ }0 o* h ~
; G/ `, {$ l- |解题思路
$ q( x+ B7 [; d7 O" V: f典型的二分答案题目。
" i0 t$ m4 R$ m5 f( A- p) F5 T; k( z0 h, n- H
代码展示0 w% V7 R1 s; y
$ c. D0 z# M& N+ g+ g9 j: @
# i2 [7 }) Y+ Z$ q' ~# Iclass Solution {
: V! O/ X, q( H) d2 B+ ]7 S public int maximumCandies(int[] candies, long k) {
6 u* h% O5 b( D7 m' d int l = 0, r = Arrays.stream(candies).max().getAsInt();
) B' Z; h* @7 Y+ R while (l + 1 < r) {! o* O; y2 W K0 }5 M( ]- ]- K
int mid = (l + r) / 2;& O' l* M2 K1 R9 S4 D% p8 o8 Q3 p
if (check(mid, candies, k)) {
1 j7 j3 c& {- \* i7 v l = mid;
# t( t; D0 J' E$ y# x } else {. }4 a* Q. E5 H
r = mid;
) y' i5 B7 l5 _& l1 _3 v1 V4 C }
" U2 ?. |1 G- d! d% G* ]5 Z, i }' i8 C4 w, H" k. e' W* {! T
return check(r, candies, k) ? r : l;
6 n% q1 d. K+ f. W+ ] }
; n+ Q3 X3 L+ b- ]4 d3 m. w2 {; j, i# N6 X" g- V
private boolean check(int r, int[] candies, long k) {
! ^! T. C* `+ \6 X+ ^' |+ b for (int c : candies) {
) m3 b* ]0 ?+ T. `1 I k -= c / r;
0 M! W/ W& H J L3 A5 N( h }+ ~1 f; q! F- q3 u
return k <= 0;( H6 D% j( U( j9 k8 d
}5 W6 `$ G5 d+ A) i3 y$ |
}: i( w3 n% q! o* B
% Y; b4 E% ?5 ~" i% F! r* d$ N
/ _" f0 M' T" }6 k【 NO.4 加密解密字符串】& T5 f; z0 q/ U9 D8 J% \2 W
+ \9 o7 ?% A9 p: d" M解题思路2 T' Y! o% Z% f6 m3 I& U( ~
使用 Map 储存 keys 和 values 的映射,即可完成加密。- J, \6 V; c' n1 O- Z8 y. N
3 X a _ ^1 L1 ^& Q3 L8 I/ I# }
解密需要借助 Trie 树判断当前解密的字符串分支 (因为一个密文可能对应多种明文) 是否属于 dictionary& I& B0 p/ J# @) o* J9 B
% H4 {4 y( ?( ^1 h7 [' `0 `2 b, h3 l! |代码展示
/ u( L/ r+ R- k- p4 k7 b# @3 I9 c: E$ ^. R& D: K$ C+ Z W
class Encrypter {
* F( _! W4 b# S: P" L/ j, Z
8 Z) Y+ @& j% S L/ p) c( E" S char[] keys;: D9 j3 `% w) F
String[] values;; Y! I; l% X5 U d& |- S
String[] dictionary;! J7 d1 D) j; r9 o2 m/ d( g2 B2 R
: T" o% A& Y4 i8 v+ {7 E& L
String[] keyToVal;5 w5 F9 [: l7 }+ J4 t
Map<String, List<Character>> valToKey;
$ }5 w' {$ Z) O0 I4 \5 D Trie dictTrie;+ M7 ]# m6 X- D3 p- d- s) W% D2 [
4 ~) X3 I0 g( \6 e static class Trie {
+ S: ~6 V4 H: ~! I; \ public Trie() {7 y8 u. k9 P0 k
root = new Trie.Node();
8 s* ]) {6 f4 w- p; g+ D }
5 @1 D& Z) B J, h! t9 L1 |' s; ?* |+ l; P
public void add(String word) {
/ \3 @' H; ~) p; X Trie.Node node = root;2 u: `* b' D3 A t* w$ j# L5 p& m
for (var i : word.toCharArray()) {
" g8 ]% d. V1 \) E" P, W' A if (!node.children.containsKey(i)) {8 e% M! Y1 v' u5 z% \+ a. }
node.children.put(i, new Trie.Node());2 C$ E# k9 `: x, N+ X. N; U+ J+ m
}2 Z6 [) _8 B* O9 V
node = node.children.get(i);
' [3 u4 X) b7 u6 x U E9 s }
$ @, q# y+ Q# L" P node.isWord = true;
' ?) @8 w% L, Z' z8 c! x }
) ]: X8 E/ V+ r, R! c5 }- n" C+ B" P r: B7 F# v" y& @
public boolean containsWord(String word) {7 p1 W+ ]$ f& ^' O
Trie.Node node = root;! c) O# c' k+ M
for (var i : word.toCharArray()) {
; M" H- d* B% N$ \5 c4 r8 g# N if (!node.children.containsKey(i)) {
; F# Z& k2 {; Q. n: W4 @ return false;0 B! l4 N5 w. a+ S! Z2 [
}
! I e- o+ j5 v$ O( A" a" g9 T node = node.children.get(i);
$ m; u. u" q. Z$ a& u }
+ @* @! T/ n( P1 }( h# b, g+ { return node.isWord;
# g1 F+ j4 D% U6 ] }
' _$ t- y9 T! x6 `. M
% l7 P! d+ c6 Z7 _3 ^. B public final Trie.Node root;
) T& k9 H( T# G D: K
9 {3 u# i- f* _: I static class Node {
3 W' ~% m. i1 L7 n boolean isWord;
2 _6 B: W' `& L2 ]3 z, M Map<Character, Trie.Node> children;- Z# i3 e1 \: @
- ?$ X, S& _" w; L. ~+ \- E5 }. D public Node() {: c t: Z7 |' b# b( ^+ U; V
this.isWord = false;
( H+ d: h H/ g8 y' A7 a( P this.children = new HashMap<>(); z4 a7 R1 d0 T3 i( m
}
J) s H; j1 s u% { P }
9 r0 c: l: x3 @+ [; | }
" U, s- ]# c2 ?% A+ w9 [' k! f% Q/ |( E' r9 p2 ?3 h! p
public Encrypter(char[] keys, String[] values, String[] dictionary) {
; x% p' B7 L: @5 f0 ]8 j9 \ this.keys = keys;% p! w: O- \4 B3 I# C! j
this.values = values;
* o) O$ j& t( x' c2 M& L' l$ K o this.dictionary = dictionary;
& S5 s' X% }' S7 G" k keyToVal = new String[26];) m5 a0 h- l# m; F' B: ^8 G$ {
valToKey = new HashMap<>();5 B: p. r% X* A5 y2 \
for (int i = 0; i < keys.length; i++) {% z; k0 G: }! d9 U! V: o% m
keyToVal[keys[i] - 'a'] = values[i];
1 M5 Q b* ]2 E8 Q; x3 T if (!valToKey.containsKey(values[i])) {
6 f9 T2 x3 u1 ]/ S" q valToKey.put(values[i], new ArrayList<>());
, z- D5 U0 ?" V }6 h+ e E' ^' g( F9 Q
valToKey.get(values[i]).add(keys[i]);0 H1 J7 ?- ~' X1 ^1 ~# |
}
3 {1 N2 a. t, H dictTrie = new Trie();
% V7 V/ ~! R! ^ for (String s : dictionary) {( Q( E# Y* | ?
dictTrie.add(s);
, C/ b( ^- q" N* C1 u* v" e }
% \4 w# Z$ n0 [; F4 I5 j ^% B }
) \ c6 e4 h: G) m* \8 T N3 C d; k. W$ ^
public String encrypt(String word1) {
9 [! c! B. e+ ] StringBuilder builder = new StringBuilder(); J2 Y' F$ M) k2 `, s
for (int i = 0; i < word1.length(); i++) {
4 s% y& R4 z, R. d5 c builder.append(keyToVal[word1.charAt(i) - 'a']);4 A; ~' x6 z3 k5 i! i! T! `
}
" G* R v- S# Y; K! s# W/ q return builder.toString();
2 M" T0 p# l1 G4 X }
2 m3 y1 @+ @$ ~2 ~* |4 p( p
' b+ u y, m8 n4 T' D0 P public int decrypt(String word2) {+ A3 l5 S1 |1 h( @2 l/ H
return decrypt(word2, dictTrie.root);
& ~( y3 ^7 D; w2 g5 c }! {+ S8 w% |6 ~' g0 p
5 L6 {! a/ E, j6 J$ e! l9 U final private List<Character> emptyList = new ArrayList<>();
0 K n3 f& _* [! b' ~% H% S$ c. K! @- H2 ^) S% g7 z* S# g
private int decrypt(String word2, Trie.Node node) {
8 h7 E' z8 E/ m& l% o2 z2 O6 j3 [: C if (word2.length() == 0) {" u! n1 M( T% s. H
return node.isWord ? 1 : 0;/ e; O+ I! m3 J3 S) h
}
( F" t5 Q4 K* S; S5 h8 ^ if (!valToKey.containsKey(word2.substring(0, 2))) {
! k4 V9 w4 }7 R return 0;. v" C, j+ S& \
}
$ T$ M/ V, I- @4 K$ U1 k8 z' M var cand = valToKey.get(word2.substring(0, 2));, L c& ]: X- ~2 H J
int res = 0; u& q' }3 J5 `: m8 D1 A: o9 S
for (var c : cand) {/ p' U$ o! U0 ^$ x0 Y1 e: _% m
if (node.children.containsKey(c)) {
" @5 x* i) P8 k/ H% { res += decrypt(word2.substring(2), node.children.get(c));* O2 B0 y8 z3 q
}, r) N) K: @7 z4 G
}
2 x# Z( p. J; Z4 S* K" ^. W8 S: C8 v return res;4 J6 n2 P0 {% S9 B' r2 l5 _
}
3 ~" R) H% x$ e& t8 t4 ?9 r/ b} |