【ARTS】002-第二周(2020.06.01-2020.06.07)

一、Algorithm

1. 题目

  给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

  示例:

 1 // 示例 1:
 2 输入: 123
 3 输出: 321
 4 
 5 // 示例 2:
 6 输入: -123
 7 输出: -321
 8 
 9 // 示例 3:
10 输入: 120
11 输出: 21

  注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,  231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

2. 题解

整数反转的思路:

  通过对 10 取余,可以获取当前最后一位数字。将结果变量乘以 10,再加上新获取的最后一位数字,即实现了反转。可以理解成把原数字的每一位倒着挤出来,送入新的结果变量。

INT_MAX & INT_MIN

  首先,C/C++ 在 limits.h 中定义了常量 INT_MAXINT_MIN,用于表示整型变量的最大值和最小值。

  因为 int 类型变量占 4 字节(32 位),所以 INT_MAX = 231-1,INT_MIN= -231。C/C++ 中,所有超过该限值的整型数,都会出现溢出,导致 warning,但是并不会出现 error。如果想表示的整数超过了该限值,可以使用长整型 long long(8 字节)。

  INT_MAX 和 INT_MIN 的运算如下:

    • INT_MAX + 1 = INT_MIN

    • INT_MIN - 1 = INT_MAX

    • abs(INT_MIN) = INT_MIN

    • INT_MAX + INT_MAX = -2

    • INT_MIN + INT_MIN = 0 。

  换个角度理解,前三条运算性质如下:

    • INT_MAX + 1 < INT_MAX

    • INT_MIN - 1 > INT_MIN

    • abs(INT_MIN) < 0
 1 int reverse(int x){
 2     
 3     int result = 0;
 4 
 5     while (x)
 6     {
 7         if (result > INT_MAX / 10 || result < INT_MIN / 10)
 8         {
 9             return 0;
10         }
11 
12         result = result * 10 + x % 10;
13 
14         x /= 10;
15     }
16 
17     return result;
18 }

 

二、Review

  本周阅读的文章为:《If You Want to Be a Senior Developer, Stop Focusing on Syntax》

  作者探讨了这样一个问题:初级开发者往往将注意力集中在学习、记忆某种编程语言和框架的语法细节。他们为此烦恼,甚至以开发过程中需要查阅文档为耻。

  但对于有使用多种语言开发经历的高级开发者而言,他们并不认为需要记忆这些语法细节。很多大牛坦承,自己编程时也经常谷歌。甚至于,连招聘者都不是很在意这些细节。因为这些语法细节完全可以使用 IDE 解决。

  对于高级开发者而言,即便是从未接触过的技术,也“不过是另一种工具”。他们并不需要先掌握这项新技术的全部细节再开始工作,而是用几个小时来阅读文档,建立基本的认识。此时开发工作就可以开始了,在开发过程中遇到问题,随用随学即可。

  当下,技术的快速迭代使得我们有学不完的新知识——新的语言、新的框架,亦或原有语言或框架的大量更新。你几乎不可能掌握所有的细节,而且这样做的性价比太低了。

  牛叉的工程师,应该更注重这两项能力:

  • 对于新知识,如何在短时间内建立基本认知,快速上手。
  • 在开发过程中遇到问题,如何善用搜索引擎,快速找到解决问题的方法。

  在学习过程中也是如此,你不可能等到万事具备才启程。先掌握目前需要的知识,然后继续前行。遇到下一个问题时,再停下来寻求解决之道。这就好比开车出行,如果你想等到一路都是绿灯才动身,那你永远无法抵达。正确的方法是,先把眼前的绿灯开过去,遇到红灯就停下来,变成绿灯后再继续前行。

 

单词/词组

  grocery                            n. 杂货店

  beat yourself up              自责

       intentionally                     adv. 有意地

  sufficient                         adj. 充足的

 

三、Tips

  https://www.cnblogs.com/murongmochen/p/12964618.html

 

四、Share

  《别让自己“墙”了自己》

  • 要融入一流的舞台和团队。视野、环境和舞台,对一个人的限制非常大。

  • 做有价值的事。不要把自己的时间浪费在“写玩具代码”、“搬砖”、“用蛮力加班”的境地。所谓有价值,就是别人愿为此付高价的、高技术门槛的、有创造力的、颠覆性的。

  • 不要封闭自己的技术栈,对于好的程序员来说,完全可以同时掌握几门语言和技术。偏见和不开放,对一个人的限制是真正有毁灭性的。主动让自己成为一个瞎子和聋子,主动把自己的能力阉割掉,这是一件令人痛心的事。谭嗣同说“把卷撑开海眼银”,要广泛地吸收新知识,而非将自己封闭起来。

  • 要穷举各种方法来解决问题,而非寻找借口。要努力改变自己的问题和缺陷,而非放任自流。我们可能会受到各种外在因素的限制,譬如“我家在河北,所以不能去上海、深圳(好在还有个北京可选)”。譬如“我是学测控技术与仪器的,所以无法与计算机专业的同学竞争,不能做软件开发”。这些问题虽然客观存在,但并非无法可解。关键在于,我们发现问题后,是想方设法去解决它,还是以此为借口,封闭这个方向的所有可能。

  • 要以开放的态度来拥抱新技能和新思维。英语对能否融入世界起到决定性的作用,不过关,就去练习。写代码的习惯不好,就去改变。你的视野决定了你是否知道要去哪,你的开放程度决定了你是否愿意为之改变。

  • 要精于计算得失,学会取舍,抓主要矛盾。一般人算计短期内能得到什么,而优秀的人则是舍在今天,得在未来。整日纠结于低维度的问题(薪水不多、工作地点、是否能稳定到退休),会让人沦于平庸。要习惯从更高的维度来思考问题(譬如是否开阔了眼界、是否提升了竞争力、能否解决更难问题,创造更大价值)。

  • 要勇于跳出传统的束缚。敢想敢拼的人,最差不过是没有成功,回到起点。连想都不敢想的人,只能缩在起点,做一只鹌鹑。

 

  最后,以文中引用庄子的论述来作为结尾,并自我鞭策吧:

  井蛙不可以语于海者,拘于虚也。(此为受到空间局限)

  夏虫不可以语于冰者,笃于时也。(此为受到时间局限)

  曲士不可以语于道者,束于教也。(此为受到认知局限)

posted @ 2020-06-07 22:36  Albert-陌尘  阅读(118)  评论(0编辑  收藏  举报