找回密码
 注册账号
置顶:如何加入2024届新生微信群

[吹水聊天] 上岸算法 I LeetCode Weekly Contest 241解题报告【含秋招咨询群】

上岸算法 回复:0 | 查看:2085 | 发表于 2021-5-17 07:19:53 |阅读模式 |复制链接

UWCSSA提醒您:

警惕网络诈骗与盗号,不要在他人发送的网站中输入密码,换汇或付款时请小心诈骗。

为了避免个人信息泄漏,建议在帖子中使用不常用的邮箱,或使用私信发送联系方式(点击对方的头像,然后“发送消息”)。

帖子通过审核只代表内容不违规,CSSA 不会验证内容的真实性。请谨防诈骗。


" F: q* W- l2 _9 S/ z! I
2021 秋招时间线如下,建一个求职免费咨询群,群内将有FLAG 面试官就秋招趋势/如何准备等问题亲自答疑
- b( G2 p/ B. J8 x1 J7 @! d1 n- W
- g7 X, v# L9 d5 C  j3 R
1 @  a& l; ~; Y+ R
* Y( ]4 Z8 k3 k: I' h' Q* T% z. d+ a; I& {
No.1 找出所有子集的异或总和再求和
解题思路
通过二进制位枚举一个集合的所有子集。
代码展示
  1. class Solution {
    2 C+ _5 V4 \. n7 q4 s
  2.     public int subsetXORSum(int[] nums) {
    7 w0 b' ?" ]7 |! S" w2 L
  3.         int n = nums.length;
    , S7 c$ P5 N1 }6 a: N& k; w
  4.         int sum = 0;
    3 k+ H; K- I$ `2 n* Y5 e2 }
  5.         for (int i = 0; i < (1 << n); i++) {
    - S: H$ P% T1 M( c. r: ~# F: k, D
  6.             int xor = 0;
      K( k4 }7 Q3 |- v6 O  M
  7.             for (int j = 0; j < n; j++) {
    * P3 H/ F# i9 R/ Y. c1 v
  8.                 if (((1 << j) & i) > 0) {
    " {- L5 X7 u0 J, C/ e! W
  9.                     xor ^= nums[j];
    ) o: D: a* q2 L7 c# w5 ^3 z
  10.                 }
    & Y: g1 H; Y* H, e. v
  11.             }
    # ^2 `8 p6 i4 _# @" q+ k& R
  12.             sum += xor;
    4 Y# J% f6 B6 ]; x: B+ S
  13.         }
    0 H& F1 F6 Y! x6 [8 U3 I: ?; ?
  14.         return sum;1 z( z* q$ A+ b* N/ l5 N+ i
  15.     }; i3 l) u( T+ A* g3 U
  16. }
复制代码
No.2 构成交替字符串需要的最小交换次数
解题思路
如果 0 和 1 相差的数量超过 1 则直接返回 -1
如果 0 和 1 一样多,那么最终结果有两种情况,反之最终结果是唯一的。只需要统计出多少个数字位置不对即可,因为每次交换都可以减少 2 个位置不对的数字的数量。
代码展示
  1. class Solution {
    4 R% X% s8 j: L. i# O
  2.     public int minSwaps(String s) {5 o% Y# g" e# w* Z0 i- T
  3.         char[] str = s.toCharArray();( ]9 G; `6 s6 X; W0 R
  4.         int cnt = 0;" T! P6 x0 T4 U. E- x. ^4 C: W9 W
  5.         for (int i = 0; i < str.length; i++) {9 Z5 i  T; J* s
  6.             if (str[i] == '0') {
    , `" p. c- f6 M+ Z) |* Z0 f
  7.                 cnt++;
    ! x4 }) N2 Y& G4 m; |2 D3 h8 m
  8.             } else {
    - e  \2 X9 e& u$ b
  9.                 cnt--;* F6 O4 @* {2 C5 Q  k5 I
  10.             }( o8 z; \+ G  r7 c
  11.         }
    - Q- n8 A3 E- |% t1 e9 a; E
  12.         if (cnt > 1 || cnt < -1) {
    ) q( w& k: ^0 p  j1 k6 e0 k5 Q0 j2 H
  13.             return -1;
    7 q. X5 ?* P8 e% N" J
  14.         }
    3 D6 O' U' _: B0 k9 M3 _
  15.         if (cnt == 0) {9 ]+ V) a2 G' X7 z/ a
  16.             return Math.min(minSwaps(str, 0), minSwaps(str, 1));' x+ c* q% ]- \4 d0 `
  17.         }; |8 p8 f2 `$ }7 U0 d% B
  18.         if (cnt == 1) {
    % T+ A8 K/ y" k* [: J) x/ ^5 y
  19.             return minSwaps(str, 0);
    : g0 f1 ]) {: l
  20.         }
    : U+ z. l! h; D+ b8 R0 \/ r) B
  21.         return minSwaps(str, 1);
    1 Z& P9 t9 t' |$ u+ Y
  22.     }0 y( B9 t. E5 \

  23. 7 u1 u: N& H. N( ^& k8 H
  24.     int minSwaps(char[] str, int start) {
    . p, P6 Q( Q/ e! q( e& Z
  25.         int cnt = 0;( g1 W: k2 `2 T: l! B& r+ V$ U- H3 B
  26.         for (int i = 0; i < str.length; i++) {
    $ v# i$ `& {( U. b2 U- a( C; |. T
  27.             if (str[i] != '0' + start) {
    9 b7 C9 S6 X+ D
  28.                 cnt++;
    9 D  ^8 d; E6 ^
  29.             }
    7 p: x' w$ |, Q, A* f
  30.             start ^= 1;
    2 a6 Y0 g2 v" H. Q  L9 [( X
  31.         }
    $ u! m1 {! C% \8 g3 Z
  32.         return cnt / 2;8 E- _- r8 B% C3 D4 c( Y
  33.     }
    ( x' O/ S8 V' l3 g
  34. }
复制代码
No.3 找出和为指定值的下标对
解题思路
根据数据范围,使用 Map 维护 nums2 中各个数值的数量,每次统计时枚举 nums1 即可。
代码展示
  1. class FindSumPairs {4 l: V# X, h6 n  o" {

  2. / B% {* s! v6 V$ x6 k0 p
  3.     Map<Integer, Integer> count2;$ g# e, N. S+ P4 ?  d
  4.     int[] nums1;
    2 I: [4 F6 W( W6 [+ U! B" ~
  5.     int[] nums2;
    8 Y1 J& [/ ?; `2 Q* y2 \% b; H

  6. ) m) j* ^2 X3 `) B: x
  7.     public FindSumPairs(int[] nums1, int[] nums2) {3 [% a+ u0 j, h) z/ A' }* t, [
  8.         count2 = new HashMap<>();" W' B) t9 v6 o3 m* v+ J
  9.         this.nums1 = nums1;, y; c; k0 |( y* W: N2 C
  10.         this.nums2 = nums2;# z4 C$ q( s6 g* @+ C8 T! Y6 k
  11.         for (int num : nums2) {
    / G' e" s  B3 M( k$ @3 ^
  12.             count2.put(num, count2.getOrDefault(num, 0) + 1);. n' t! h. s+ r7 d
  13.         }
      R- a& T( [. @$ [3 I
  14.     }3 |) o: V. ~7 N0 R
  15. 5 s" B) h  Q8 F3 m! B  C: X+ t
  16.     public void add(int index, int val) {
    0 v# A. B) P2 B7 g, u3 ^  e- C
  17.         count2.put(nums2[index], count2.getOrDefault(nums2[index], 0) - 1);
    8 K; t# W2 l- _9 P
  18.         nums2[index] += val;4 N; |2 N8 k3 n  {: i( Y& e' F
  19.         count2.put(nums2[index], count2.getOrDefault(nums2[index], 0) + 1);5 C4 k! ?1 y4 H7 o8 o* `& I7 p4 }
  20.     }
    - X. F% G7 g8 o8 A& t

  21. + j( v* H6 M9 a# C" D
  22.     public int count(int tot) {; ^2 R. l  J7 ~0 C$ {
  23.         int res = 0;
    + Y" r, R. y- y( Q! }( `
  24.         for (int num : nums1) {/ L- u/ E& S& p4 z7 L2 C8 m
  25.             res += count2.getOrDefault(tot - num, 0);
    + Z/ b* \3 w. A6 \1 ?0 K* C* Z
  26.         }
    / Y6 K& _. g) ]( m) O8 U
  27.         return res;
    / k( j1 S  @0 I7 M0 U- Q
  28.     }2 h3 w; ~6 D% f; J  q
  29. }
复制代码
No.4 恰有 K 根木棍可以看到的排列数目
解题思路
动态规划,dp[n][k] = dp[n-1][k-1]*(n-1) + dp[n-1][k]
思考过程就是从高到低依次放木板。
代码展示
  1. class Solution {3 N$ j1 ~5 w; o) n& k: p
  2.     public int rearrangeSticks(int n, int k) {5 C4 h$ }! I# d9 h" P
  3.         long[][] dp = new long[2000][2000];
    3 }- Q8 A" P. L* @
  4.         long mod = 1000000007;
    % O6 G7 a7 |7 X; I
  5.         dp[1][1] = 1;
    . H  d! S1 x8 T; y
  6.         for (int i = 2; i <= n; i++) {6 D3 h$ x, K* `4 Z* M4 J9 @# S
  7.             for (int j = 1; j <= i; j++) {
    , f/ E2 ~( r. y0 U" y- L" P+ |/ G
  8.                 dp[i][j] = (dp[i - 1][j] * (i - 1) + dp[i - 1][j - 1]) % mod;
    9 Z8 Y0 X. S( N# ~
  9.             }
    - I6 C( q; ^9 W4 g$ p5 y
  10.         }
    8 G" T! c, k, q; u) [8 Q; ?, n" K
  11.         return (int) dp[n][k];
    & [& ?9 f- r" C) h1 o
  12.     }
    9 R' T0 d; f8 Y6 X2 F% O
  13. }
复制代码
上岸算法网络科技有限公司
上岸算法网络科技有限公司是一家致力于用高质量,高互动性小班课程来帮助学生更好的在就业市场中定位以及求职的公司。我们以顶级的课程质量,高互动性的教学方式以及独特的小班教学模式来帮助学生更快的跨过求职的鸿沟,用最高效,经济,合理的方式帮助更多学生快速找到梦寐以求的工作。

9 I  d; Q* r  o# P4 }
; s2 K: x8 O* A# C- s: q* A% f9 z5 c  E! J6 T+ J& Q* N

$ q: D; b. \( m+ @1 b+ U3 _! Q

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册账号

x
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

登录 发布 快速回复 返回顶部 返回列表