Dimple在左耳听风ARTS打卡(第三期)

不知不觉已经来到了第三期,也不知道能坚持到哪期,这样驱动着我持续学习,不停地鞭策着我,压力好大,收获好多。学会时代落下的账,正在慢慢弥补中。哈哈哈哈

所谓ARTS: 每周至少做一个LeetCode的算法题;阅读并点评至少一篇英文技术文章;学习至少一个技术技巧;分享一篇有观点和思考的技术文章。(也就是Algorithm、Review、Tip、Share 简称ARTS)这是第三期打卡。

Algorithm LeetCode算法

回文数palindrome    

(https://leetcode.com/problems/palindrome-number)

题目描述:判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例1:

    输入:121
    输出:true

示例2:

    输入:-121
    输出:false
    解释:从左向右读,为-121.从右向左读,为121-。因为它不是一个回文数

示例3:

    输入:10
    输出:false
    解释:从右向左读,为01.因此它不是一个回文数

一看到这道题的时候,发现和上次写的整数反转有点类似,其实核心都是一样的。上次就是需要考虑溢出的问题,这里起先有些答案也说需要考虑溢出的问题,但其实后面仔细想想 ,没有必要,如果他是回文数,必然都是左右对称的数字,所以溢出其实并不存在,不然回文也肯定回文不了的。小编用了上一篇的思想,只不过用了一个相对来说还是性能不够好的方法,把它全部转换后才进行比较是否为回文。

public static boolean isPalindrome(int x) {
        int original = x;
        if (x < 0) {
            return false;
        }

        int result = 0;
        while (x != 0) {
            int first = x % 10;

            result = result * 10 + first;
            System.out.println("result = " + result);
            x = x / 10;

        }
        System.out.println(result);
        if (result == original) {
            return true;
        }
        return false;
    }

其实,因为是回文数,我们其实只需要考虑反转数字的一半就可以了。毕竟,如果该数字是回文数,其后半部分反转后与原始数字的前半部分相同的。比如,输入1221,将数字后半部分从21转换成12,并将与其前半部分12进行比较,因为二者相同,就是回文了。

但是问题来了,怎么知道已经到达一半了呢?在整数反转的过程中,我们将原始数字除以10,然后给反转后的数字乘以10,所以,当原始数字小于反转后的数字时,就意味着我们已经处理了一半位数的数字,效率比小编之前写的还能提升一半。

public static boolean isPalindromeNew(int x) {
        // 特殊情况:
        // 如上所述,当 x < 0 时,x 不是回文数。
        // 同样地,如果数字的最后一位是 0,为了使该数字为回文,
        // 则其第一位数字也应该是 0
        // 只有 0 满足这一属性
        if (x < 0 || (x % 10 == 0 && x != 0)) {
            return false;
        }

        int revertedNumber = 0;
        while (x > revertedNumber) {
            revertedNumber = revertedNumber * 10 + x % 10;
            x /= 10;
        }

        // 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。
        // 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,
        // 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
        return x == revertedNumber || x == revertedNumber / 10;
    }

Review 阅读并点评至少一篇英文文章

华为是5G崛起的龙  (https://medium.com/futuresin/huawei-is-rising-dragon-of-5g-5fa9931cc167)

华为在之前出了2018年的年报,因为自己本身就在杭州研究所工作过,所以还是比较关心这家公司的成绩,真的很是亮眼。

在5G技术上,华为已经处于领先的地位。而且之前的Mate X手机,已经支持5G技术,可以说华为把5G技术带到了现实,而不是纸面上的描述。但是因为某些方面的原因,美国,欧盟,新西兰,加拿大等国家有的和美国统一战线,在禁止华为5G在其国内的使用;有的已经意识到之前的错误,现在对华为5G成了开放的态度。

中国科技公司,不仅仅是华为,还有字节跳动,阿里巴巴,百度,腾讯等等都在和同类型的美国硅谷公司比较,竞争。文中出现了担忧,中国科技公司的发展迅猛,已经威胁到美国公司的利益。这也体现了我们国家科技的进步,我尤其是对阿里巴巴表示钦佩。阿里巴巴的达摩院,汇聚了世界上一流的科学家,前段时间AI框架大牛贾扬清离职Facebook,加盟阿里硅谷研究院,阿里正在世界顶端持续奋斗者。还有华为,华为对于研发的投入, 占比在年报里可以提现出来,尤其是5G的处世,更加增强了作为技术人,作为中国人的骄傲。

华为是5G世界崛起的龙,中国科技是崛起的龙,五千年的文化,如今的中国不再是沉睡的狮子,而是崛起的龙。文章看的心潮澎湃,为自己的国家骄傲,为我们的科技骄傲,为我们的努力骄傲。

Tip 一个技术技巧

这次我们聊一聊Java OutOfMemoryError的知识,因为极客时间Java核心技术36讲的25课有描述,特意做了笔记,同大家一起共享。还有垃圾收集相关,计划在后面分享噢。

典型回答:

  • 首先,程序计数器(PC,Program Counter Register)

  • 第二,Java虚拟机栈(Java Virtual Machine Stack),早起也叫Java栈。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的Java方法调用

  • 第三,堆(Heap),Java内存管理的核心区域,用来防止Java对象实例,几乎所有创建的java对象实例都是被直接分配在堆上。堆被所有的线程共享,在虚拟机启动时,我们指定“Xmx”之类参数就是用来指定最大堆空间等指标

  • 第四,方法区(Method Area)这也是所有线程共享的一块内存区域,用于存储所谓的元(Meta)数据,例如类结构信息,以及对应的运行时常量池、字段、方法代码等。早期称为永久代(Permanent Generation),JDK 8将永久代移除,同时增加了元数据区(Metaspace)

  • 第五,运行时常量池(Run-Time Constant Pool),这是方法区的一部分

  • 第六,本地方法栈(Native Method Stack),与Java虚拟机栈非常相似,支持对本地方法的调用,也是每个线程都会创建一个

Java对象是不是都创建在堆上的呢?一些观点认为通过逃逸分析,JVM会在栈上分配那些不会逃逸的对象。所以可以明确,所有的对象实例都是创建在堆上

除程序计数器,其他区域都有可能会因为可能的空间不足发生OutOfMemoryError,简单总结如下:

  • 堆内存不足是最常见的OOM原因之一,抛出"java.lang.OutOfMemoryError:Java heap space"

  • 而对于Java虚拟机栈和本地方法栈,稍微复杂一点。详细看文章

  • 对于老版本Oracle JDK,因为永久代的大小是有限的,并且JVM对永久代辣鸡回收不积极,所以当不断添加新类型的时候,就会出现。"java.lang.OutOfMemoryError:PermGen space"

  • 随着元数据区的引入,方法区内存已经不再那么窘迫,所以相应的OOM有所改观,"java.lang.OutOfMemoryError:Metaspace"

  • 直接内存不足

Share 一篇有观点和思考的技术文章

继续设计模式的学习执行,更新到观察者模式

公众号地址:
设计模式之观察者模式(一)

                    爱生活,爱学习,爱感悟,爱挨踢

640?wx_fmt=jpeg


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小跃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值