不知不觉已经来到了第三期,也不知道能坚持到哪期,这样驱动着我持续学习,不停地鞭策着我,压力好大,收获好多。学会时代落下的账,正在慢慢弥补中。哈哈哈哈
所谓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](https://i-blog.csdnimg.cn/blog_migrate/ee0385661e06057405736212e706e6db.jpeg)