错误笔记

反转括号子串

反转每对括号间的子串

使用最直接的解体思路:

  1. 定位一对括号(可从最里面开始)
  2. 反转括号内子串
  3. 去除括号(可替换为空格,或其他“非法”字符)
  4. 重复1直到找不到括号
  5. 返回结果

汉明距离

汉明距离

两个二进制数中位数不同的个数。用XOR,数1的个数。

2的幂

2的幂

给定一个整数x,判断x是否是2的幂(2^y = x)。

已知x为32位二进制数。

Tips:

  • 给定一个32位二进制数,求最高位二进制的位数:右移1/2/4/8/16取或,将所有后续位置为1,最后加一除2。

    // 
    // 100000 --> 110000 --> 111100 --> 111111 --> ...
    
    int getMSB(int m){
    long n = m;
    n |= n >> 1; //最高位及后变为两个1
    n |= n >> 2; // 最高位及后<=4个1
    n |= n >> 4; // 最高位及后<=8个1
    n |= n >> 8; // 最高位及后<=16个1
    n |= n >> 16; // 最高位及后<=32个1
    n = n + 1;
    return (n>>1);
    }
  • 另解:用除2取余的方式检查最高位后面的位数,直到发现非0或到达最高位(除2得1).

目标和表达式

目标和

给定数组,用正负串联每个数,最终结果为Target的串联方式的个数。

题解:使用递归,每个元素取正负两种情况,记下sum,最终结果是Target,返回1.

另解:动态规划dp

一题四解:宫水三叶

  • 问题转化:数组总和为sum, 目标为Target, 则问题可以是,找出数组中的数和为(sum-Target)/2的组合的个数。

最后一块石头的重量

最后一块石头的重量

一堆石头,整数数组stones表示每一块的重量。 任意选择两块石头,相撞,重量相互抵消,剩余量非零则再放入数组中。 求不同的相撞方案,最后一块石头的最小重量。

题解:递归,遍历,每次生成新数组,取全局最小。->超时。

另解:动态规划:石头分为正数堆和负数堆,求解两堆只差最小值。或者:石头总重sum,求解子数组总和不大于sum/2的最大值。dp[i][j]: 前i块石头,总和不大于j的最大值。

dp[i][j] = max(dp[i-1][j], dp[i-1][j-stones[i]] + stones[i])

  • 维度[i]可优化掉。i = 1 初始化每个dp[j]; 之后的i, 每次j从最大开始遍历,dp[j-x]就存储的是i-1的值。

完全平方数

完全平方数

给定正整数n,找到若干个完全平方数(比如,1,4,9,16,……)使得他们的和等于n。 需要让组成和的完全平方数的个数最少。

给定一个正整数n,返回和为n的完全平方数的最少数量。

题解:动态规划: dp[i][j] 前i个完全平方数中,和为j的平方数的最少个数。

dp[i][j] = min(dp[i-1][j], dp[i-1][j-x*sq[i]] + x)

  • 优化:去掉维度[i],i=1时初始化所有j; 之后的i,每次从最大的j开始遍历。
  • 注意:i最大为$\lfloor\sqrt{n}\rfloor$.

汉明距离总和

汉明距离总和

问题:给你一个整数数组 nums, 请你计算并返回 nums 中任意两个数之间汉明距离的总和。

问题转化:数0和1的个数并利用乘法原理。题解

第一个错误的版本

题目

思路:二进制搜索。

错误:long与int的除法运算、类型转换的运算次序:

middle = (int)(((long)start + (long)end)/2); => long -> /2 -> int => good.
middle = (int)((long)start + (long)end)/2; => long-> int -> /2 => wrong, negitive

寻找两个正序数组的中位数

思路:同时扫描两个数组,直到找到第n/2个。

判定两个字符串是否可以互为重排

题目

注意:字符串指针 char *str; 取字符比较使用 *str == 'A';下一个字符可用str++.

Expand me...

字符串URL化

题目

注意:理解题意:其中的“真实”长度指字符串的有意义的子串长度。

Expand me...

LFU缓存

题目

注意:struct 用法

  • typedef
  • struct 数组与struct指针数组的不同使用方式。(本题中仅仅使用了struct数组,未用指针数组)
  • 固定容量的双向链表,无论node是否存有数据,都要需处理好各个node之间的链接,
  • 容量边界值(0)的处理
Expand me...

数位成本和为目标值的最大数字

题目

超时思路:动态规划dp[i][j]: 数字长度为i位,成本为j时的最大数字。

Expand me...
优化思路题解: 分两部考虑问题:1,用动态规划求出最多数位的个数;2,从大数位到小数位构造数字。

Expand me...

石子游戏

一堆堆石子排成一行,每堆都有正整数颗石子。piles[i]

亚历克斯和李轮流从 piles两端取一堆石子,直到没有石子剩下。

最后石子最多的人获胜。

More

Created Jun 14, 2021 // Last Updated Jul 6, 2021

If you could revise
the fundmental principles of
computer system design
to improve security...

... what would you change?