什么是ARTS:

  • Algorithm。主要是为了编程训练和学习。每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard)。进行编程训练,如果不训练你看再多的算法书,你依然不会做算法题,看完书后,你需要训练。
  • Review:主要是为了学习英文,如果你的英文不行,你基本上无缘技术高手。所以,需要阅读并点评至少一篇英文技术文章,
  • Tip:主要是为了总结和归纳你在是常工作中所遇到的知识点。学习至少一个技术技巧。你在工作中遇到的问题,踩过的坑,学习的点滴知识。
  • Share:主要是为了建立你的影响力,能够输出价值观。分享一篇有观点和思考的技术文章。这就是ARTS的全部动机。

编程并非一日之功,源于兴趣,亦成于兴趣。只要选对确的方法去努力一定能看到效果。不必超于常人,你只需和常人一般便已非凡

Algorithm(算法)

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:

输入: [2,2,1]
输出: 1

示例 2:

输入: [4,1,2,1,2]
输出: 4

分析:

  • 首先确定程序是线性的时间复杂度O(n):也就是说只能存在一个for循环;同时不使用额外的空间申请内存;
  • 鲁棒性:首先确定数组不为空,如果数组大小等于2个就不存在只出现一次的元素.如果数组的大小等于1 就返回nums[0]

解法1:
我们可以根据Map的特性,相同的key,值会被替换掉.可以根据这一特性来判断数组中相同的元素,相同的元素的值我们给他自动+1,没有相同元素的值为1,这样就可以得到只出现1次的元素.

 public static int singleNumber1(int[] nums) {
        int res = 0;
        if (nums == null || nums.length < 3) {
            return res;
        }
        //通过map
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            //根据map的特性 相同的key 会被替换掉,如果上一个是 1
            Integer integer = map.get(nums[i]);//获取value
            //如果value是空 当前的key会自动加1
            map.put(nums[i], ((integer == null) ? 0 : integer) + 1);
        }
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if (entry.getValue() == 1) {
                return entry.getKey();
            }
        }
        return res;
    }

上述方法虽然解决了问题,但是我们使用了额外的内存空间,在性能上还是无法做到最佳的.

解法2:对数组进行重新排序,相邻的不相同则就返回

Arrays.sort(nums);
        // 1 1 2 2 4
        // 1 2 2 3 3
        // 1 2 2
        for (int i = 0; i < nums.length; i = i + 2) {
            if (i + 1 >= nums.length) {
                return nums[i];
            }
            if (nums[i] != nums[i + 1]) {
                return nums[i];
            }

        }

上述解法在性能上有了很大的提升,当时Arrays.sort(nums)是比较耗费性能的
解法3: 使用异或运算^

参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。即:0^0=01^0=10^1=11^1=0

例如:10100001^00010001=10110000

0^0=0,0^1=1 0异或任何数=任何数

1^0=1,1^1=0 1异或任何数-任何数取反

任何数异或自己=把自己置0

(1)按位异或可以用来使某些特定的位翻转,如对数10100001的第2位和第3位翻转,可以将数与00000110进行按位异或运算。

          10100001^00000110=10100111 //1010 0001 ^ 0x06 = 1010 0001 ^ 6

(2)通过按位异或运算,可以实现两个值的交换,而不必使用临时变量。例如交换两个整数a,b的值,可通过下列语句实现:

    a=10100001,b=00000110

    a=a^b;   //a=10100111

    b=b^a;   //b=10100001

    a=a^b;   //a=00000110

(3)异或运算符的特点是:数a两次异或同一个数b(a=a^b^b)仍然为原值a.

0^0=0,0^1=1 0异或任何数=任何数

1^0=1,1^1=0 1异或任何数-任何数取反

假设数组:[2,2,1],for 循环进行异或运算
模拟:
f=0;
f = f ^ nums[i];
f = 00000000;
nums[0] = 00000010

f = 00000000 ^
00000010
00000010
nums[1] = 00000010
f= 00000010 ^
00000010
00000000
nums[2] = 00000001
f= 0000000 ^ 00000001 = 00000001

从上述结果中可以得出相同的两个数异或运算为 00000000;最后得到的结果一定是只出现一次的元素

 for (int i = 0; i < nums.length; i++) {
            res = res ^ nums[i];
        }

只需要两行代码就可以解决问题了.遇到问题我们需要不断寻找最优的方案.

Review(英文技术文章)

翻译如何学习编程

中文

Tip(技巧)

  • 分享一个下载mac破解软件一个网站xclient.info
  • 分享一个工具类的网站,有你想要的任何工具在线工具

  • mybatis-genertor 配置 遇到的问题
    创建 generatorConfig.xml

如果不存在mybatis-generator plugles运行下面的命令:
mvn mybatis-generator:generate
遇到的问题:

:generate (default-cli) on project primmall: Client does not support authentication protocol requested by server; consider upgrading MySQL client -> [Help 1]

解决方案:在mysql工作台执行一下命令:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '.....'

Share

Flutter 中也有WebView,那么Flutter如何加载Web的呢?
Flutter 提供了WebView插件,flutter_webview_plugin: ^0.3.1
对比和Android中的WebView方法相差不大.
具体的文章内容在这里:
Flutter 中WebView的使用详情