当前位置: 代码迷 >> 综合 >> ARTS 2019 06 09 (34)
  详细解决方案

ARTS 2019 06 09 (34)

热度:53   发布时间:2023-12-10 02:46:46.0

Algorithm:115. 不同的子序列
Review: 重构之前
Tip/Tech:
Share: 安卓的升级越来越慢了

Algorithm

115. 不同的子序列

https://leetcode-cn.com/problems/distinct-subsequences/
这题是动态规划的题目,但是就是我没做出来。。。
后来看到了解题的资料才明白过来,原来是这样。。
这题重点就是需要相对距离,因为是相对距离,所以只要前后顺序是按照字符串T里面的顺序出现的就可以和之前的出现的字母进行累加。
在这里插入图片描述
这里根据一篇博文的那个来进行说明,这样大概就能看懂了:
1 初始化一个二维数组dpchar[] charS = s.toCharArray(); char[] charT = t.toCharArray();
2 dp的这个二十数组进行循环判断,j来表示在数组charS的下标,i来表示
(1)第一种情况:charS[j] = charT[i] 的时候:dp[i + 1][j + 1] = dp[i][j] + dp[i + 1][j];
(2)第二种情况:chaS[j] != charT[i]的时候:dp[i + 1][j + 1] = dp[i + 1][j];
当然根据网上的文章来引用的公式那就就是:

dp[i][j] = charT[i] == charS[j] ? dp[i][j] + dp[i + 1][j] :dp[i + 1][j + 1] = dp[i + 1][j];

show the code

pclass Solution {
    public int numDistinct(String s, String t) {
    char[] charS = s.toCharArray();char[] charT = t.toCharArray();int[][] dp = new int[charT.length + 1][charS.length + 1];int lenS = charS.length;int lenT = charT.length;for (int j = 0; j < lenS; ++j) {
    dp[0][j] = 1;}for (int i = 0; i < lenT; ++i) {
    int tempNum = 0;for (int j = 0; j < lenS; ++j) {
    if (charT[i] == charS[j]) {
    dp[i + 1][j + 1] = dp[i][j] + dp[i + 1][j];} else {
    dp[i + 1][j + 1] = dp[i + 1][j];}}}return dp[lenT][lenS];}
}

Review

https://97-things-every-x-should-know.gitbooks.io/97-things-every-programmer-should-know/content/en/thing_06/

Before You Refactor

重构之前

这篇主要说的就是要在你重构之前要做的一些准备。

The best approach for restructuring starts by taking stock of the existing codebase and the tests written against that code.
Avoid the temptation to rewrite everything.
Many incremental changes are better than one massive change.
After each iteration, it is important to ensure that the existing tests pass.
Personal preferences and ego shouldn’t get in the way.
New technology is insufficient reason to refactor.
Remember that humans make mistakes.

汉化版的:

重组的最佳方法始于评估现有代码库和针对该代码编写的测试。
避免重写一切的诱惑
许多增量变化优于一次大规模变革。
每次迭代后,确保现有测试通过非常重要。
个人的风格不能丢
新技术不是重构的理由:除非成本效益分析表明新语言或框架将导致功能,可维护性或生产力方面的显着改进,否则最好保持原样。
请记住,人类会犯错误。人总是会犯错的,重构的代码不一定会比以前的更好,记住,代码是人类写的,他注定不完美,但是它人类。

Tip/Tech

根据位运算来获取一个数字的二进制的数中有多少个1

public static int oneNums(int num) {
    int count = 0;while (num != 0) {
    num = (num-1) & num;count++;}return count;
}

这里用的相与的操作。相与,就是相同位置只有都是1才是1 ,所以只要1了那么就是某个位置的肯定和之前的不一样了,每次都要想更高位置的借1来进行操作,那么只要每次循环,一直到全部位置上的数都是0,那么循环的次数就是1的个数了。

Share

https://unlikekinds.com/article/android-updates-are-getting-slower-and-slower-despite-googles-best-efforts

Android updates are getting slower and slower, despite Google’s best efforts

安卓的升级越来越慢了

其实就是很简单一个结论:使用安卓的最新的版本的机器的占有率还在不断的降低。
其实这个是很好理解的,毕竟整个系统提升,对我们来说其实是没啥太大的差别的,也许速度会快一些,,但是依然很难让大家都用最新的版本的安卓系统,所以,最新的安卓的版本的安装率特别低。
其实从这次的毛衣战可以看出来,其实谷歌的最大的武器反而不是安卓系统,毕竟安卓系统就是开源的,谷歌最大的武器其实还是他建立的生态,谷歌搜索,gmail,google play,这些才是最大的谷歌最大的武器。
其实华为这次的最大的威胁不是安卓系统,反而是如果在国外不能用谷歌的生态,基本上就是完全失去高端市场,毕竟gmail的邮箱的使用率应该是全世界最高的吧。如果没有这些软件生态,基本上华为就失去了基本的竞争力。