登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 找出数组中的第一个回文字符串】
: E- j( P: E4 D4 V; @: l, [) }5 E1 l& M
解题思路
7 @/ X$ a2 W( W$ U签到题,遍历一次即可。
9 t4 y1 T5 L" o, V5 o1 j7 `0 p7 ~ d" u; {
代码展示+ [2 g! A( H1 c. x9 T
4 @6 C6 Z. [% t- i. D* T! { Lclass Solution {
, v8 i* t' z* u- B" Q. S- T public String firstPalindrome(String[] words) {
" j( j& c; E/ g3 C8 i for (var w : words) {* R- W4 T+ o; z* n% _
boolean found = true;
5 \5 `" j3 V: \6 I+ S/ q for (int i = 0, j = w.length() - 1; i < j; i++, j--) {0 f+ `0 T0 Z( X0 V; a% W# k5 ^& f
if (w.charAt(i) != w.charAt(j)) {* d$ t6 Z6 Z6 X1 _/ c, K
found = false;
3 b; n5 B4 p* m3 h( } break;" V: U4 h0 u2 s) z6 m# ]" Z
}4 W+ O- y" G4 w1 H7 G
}7 d# \$ B' c4 x. Y
if (found) {" V: ]6 r8 j2 d; ^9 t
return w;& v/ t. J# }7 N! m
}
; ?% s8 m% f1 a. ? }
, @8 ~- a+ ^+ ^$ A1 J return "";/ J8 L. F; S; g# X5 r- o
}; ^1 ?) Z* G d2 b2 u" |" s
}" Y# i9 ]' ]" c. ^( n9 x
, c" F3 R* T7 v# q9 F- j. [+ A
: h, S }1 @2 n9 Y1 R
【 NO.2 向字符串添加空格】
3 L& E/ K! G+ n* R# S& p* Z5 u
, Z: v7 L7 [4 R% x. t& s解题思路: m, L! a* B' |
使用一个 StringBuilder 维护新的字符串。
; W- b$ c3 e" Y% x2 {9 G4 v
3 @6 y% u1 l0 W+ T代码展示* }7 x' V- u+ ^' |) r4 G
' N. \& O# z# |1 U2 xclass Solution {7 b( v( e1 i: k
public String addSpaces(String s, int[] spaces) {$ w* m6 r9 d9 E; D3 P& c
StringBuilder sb = new StringBuilder();
* k" P+ |! D# U2 ^% L int sp = 0;
, w. b7 A- P9 f5 P/ L+ | for (int i = 0; i < s.length(); i++) {& o# w- `. L8 E/ Q# M
if (sp < spaces.length && i == spaces[sp]) {
/ j$ ]2 i: r5 q! U1 r sp++;
/ q. G; Y4 J! X. r sb.append(' ');
4 V" F/ W5 {, y# [' D3 X& P1 Q }
; d( ~. r: w4 F/ w0 d' A! e1 } sb.append(s.charAt(i));7 z, b& D# f% p; ~( d+ s* M
}7 h- K' W X6 _: Q, p8 l2 n2 P' @
return sb.toString();7 q+ V" u0 x8 c+ E7 q' `1 n
}
" X6 L# b6 V+ x# \9 A0 E! d: G}4 p" `/ p x4 o6 W6 x
! S8 G$ s/ X* A
# ~" E( N5 _ R# q% t【 NO.3 向字符串添加空格】
- y5 z0 [' x$ r# D0 {+ R
; x Q* G1 w3 ~ H0 J) N8 ^解题思路6 S$ u6 K$ c4 B5 V
双指针。1 @! c. G+ k8 M0 m7 {* n
B* d% L/ a$ p9 n# R3 H
代码展示
! j& y0 ^+ |0 Z8 U. ]. Y( L( g6 R
: e ]; y( ^2 ?( rclass Solution {) ]# p0 a! c: Q% w3 a( E; l( \
public long getDescentPeriods(int[] prices) {' i! q+ J) r8 E: i4 a
long result = 0;2 ]* C2 l" v6 G$ m! |0 g; ?
for (int i = 0, j = 0; i < prices.length; i++) {5 D: T2 `3 c* D$ f7 G. Q* j5 L
if (i > 0 && prices[i] != prices[i - 1] - 1) {
. Z1 V' l) U) N5 t9 c j = i;
5 l7 j3 x3 W: F }
. T/ [) E, G# k9 \$ j // [j, i] 是一个平滑下跌阶段# N4 Y, \" Y/ k- M/ d2 a! C
result += i - j + 1;
9 d- p; v: q7 m: o5 b }
& P0 L9 M# D2 I+ V' h5 r return result;$ `% D! p/ i# t. [$ u( [' z
}1 W+ g& L$ D# p
}( f6 ^5 {. V6 O1 `4 `' P. E* W
. u& g* S8 x$ R+ C' \* ?; u$ n
9 e/ m! q3 U2 \$ k' [2 I/ @. I6 I1 P【 NO.4 使数组 K 递增的最少操作次数】
! E1 e% q5 e( h0 \3 ^6 h/ |3 E; P
( V2 k6 S3 l" d/ M1 f5 j解题思路
9 h4 C! M, Z% c" F" @原数组可以拆分成 K 个子数组,这 K 个子数组之间互不影响。
1 c2 t" o9 ?) V* D) _% \ Y) |" P: J( W! z
然后问题就变成了使一个数组变成递增的至少要改变几个元素,直接求最长递增子序列即可,使用 nlogn 的算法。
8 r9 z( V, [- J5 H
, D9 o) {0 a$ K3 X" |代码展示' k9 L2 z; k9 T" g# f" ~
4 A$ ^: ]- ^0 R. x
class Solution {9 ]+ \9 I( b. D- H9 X5 ]5 _
public int kIncreasing(int[] arr, int k) {9 p, u2 w, M" f6 `2 I$ C' x; n
int result = 0;
* y# t5 S& _$ w! @4 x& J) U for (int i = 0; i < k; i++) {
' S4 h s; C% Q6 X2 J7 ^ List<Integer> list = new ArrayList<>();* g1 _" ^ l# ]
for (int j = i; j < arr.length; j += k) {
& m0 L6 O) Z2 t. {( R list.add(arr[j]);+ Y0 z6 K7 x/ P1 i% V
}, d$ B% @, K+ D2 ~
result += increasing(list);
3 U$ f( h7 G+ s' W4 R }4 d) S# D1 K4 @- b& p6 {7 A k
return result;' a s8 O) \+ Q/ A- Q4 b$ D
}& F( e* M: k6 Z. H9 z8 C1 M( b
. o: ?4 X$ f+ g6 t: o; \1 Q private int increasing(List<Integer> nums) {# F' {/ v' C1 Q, z. p# Y8 ? m; C% I: z
// 将 nums 变成递增& L' n+ ~) C7 M6 s: t
// nlogn 求 LIS
+ t0 o# j9 Y$ L3 ]( b: X int[] dp = new int[nums.size()];
1 f( ]# Q# Z8 j9 p int len = 0;
, [0 u$ \" E+ B2 C: v for (int num : nums) {
& N7 @) G2 b4 w! {0 y, \+ y1 q# L int l = 0, r = len;
3 c& R2 L. u' O: Y while (l < r) {) T' p$ \% K' }
int mid = (l + r) / 2;
& p2 ]. ]" g5 j% y* `! V if (dp[mid] <= num) { // 非严格递增,等于也可
; ]3 @( H) x! P6 t l = mid + 1;" q- _! F8 P" ~
} else {
. m& W' y. Z, O" S0 E$ ~0 E r = mid;
# {% Z1 @% Y" x( O: L$ q0 @ }6 \& q+ B& s7 z! }' C/ k6 F
}1 B, M2 \* L5 P0 j* Z* |
if (r >= len) {+ O( M! S3 G1 C; a7 b
len++;( B; ~5 y0 z7 d$ w( @5 D
}
\7 l) q0 _! T dp[r] = num;
- e4 N) v& r9 x6 q; N$ Y5 | }/ |8 K! l/ f* X& Z7 @
4 D- D! H3 s; w1 U7 M l& S return nums.size() - len;
- T0 |; N q) p }# F$ O5 M. K/ U q4 s, o' F w( ?2 M$ R
} |