ARTS(16)

1 Algorithm

搜索旋转排序数组

假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是 $O(log n)$ 级别。

如果数组并没有被旋转,那么采用二分查找(Binary Search)方法,可以在 $O(log n)$时间内完成整个搜索。但是对于目前的条件,常规的二分查找的方法可能不太适用。因此需要改进一下判断条件。
我们都知道,如果查找算法的时间复杂度达到 $O(log n)$ 的话,必须保证在每次查找中至少丢弃掉一半的数据。尽管之前有序的数据经过一定的旋转,但是在一定的区间内是有序的,也就是这个待查找的数组是偏序的。以[4,5,6,7,0,1,2]为例,可能出现以下一种情况:

  • 轴点数据为7
    • 如果查找数据为6 : 数组第一个值为4,而4<6<7, 那么查找的数据6必定在前半个区间,后面区间数组的数据可以丢弃;
    • 如果查找数据为2: 数据第一个值为4, 而2<4<7,那么查找额数据2必定不在前半个区间,所以前半个区间可以丢弃;
  • 轴点数据为0
    • 如果查找的数据为1: 因为最后一个值为2, 而0<1<2,那么查找的数据1必定在后半区间,前面区间的数据可以丢弃;
    • 如果查找数据的为5: 因为最后一个值为2, 而0<2<5, 那么查找的数据5必定不在后半区间,那么后面区间的数据可以丢弃;

完成实现代码如下:

func search(nums []int, target int) int {
    if len(nums) == 0 {
        return -1
    }
    lo, hi := 0, len(nums)-1
    for lo < hi-1 {
        mi := (lo + hi) / 2
        if nums[mi] == target {
            return mi
        }
        if nums[lo] < nums[mi] && nums[mi] < nums[hi]{
            if nums[mi] < target {
                lo = mi + 1
            }else{
                hi = mi - 1
            }
        }
        if nums[lo] > nums[mi] && nums[mi] < nums[hi] {
            if nums[mi] < target {
                if nums[hi] >= target {
                    lo = mi +1
                }else{
                    hi = mi - 1
                }
            }else{
                hi = mi - 1
            }
        }
        if nums[lo] < nums[mi] && nums[mi] > nums[hi] {
            if nums[mi] > target {
                if nums[lo] <= target {
                    hi = mi -1
                }else {
                    lo = mi + 1
                }
            }else{
                lo = mi + 1
            }
        }
    }
    if nums[lo] == target {
        return lo
    }else if nums[hi] == target{
        return hi
    }else {
        return -1
    }
}

2 Review

How to give a great scientific talk
如果发表出色的科学演讲
“这个太恐怖了” Eileen Courtney 说道,“我好像有巨大的紧张,我甚至在那一整天没有吃任何东西。就在那个时候,我意识到我必须克服公共演讲的恐惧”。
Courtney 是在冰岛 Limerick 大学攻读二维半导体交互反应的一名博士研究生。她这个情绪来自2017年在英国曼彻斯特Microscience Microscopy会议上发表她最近的研究。
这种在舞台上要死的感觉,对于很多早期的科学家是非常常见的。这个可能来自于国际会议上的邀请;或者公众的科学小组讨论;甚至或者是面试中一个非常重要的自我演讲。
尽管演讲的观众和主题各自不同,但是所需要的技能和技巧都是类似的。那么好的演讲和差的演讲有什么区别呢?如果掌控你的舞台呢?给你的观众留下深刻的影响非常重要吗?
Standford 大学神经学专家Susan McConnell回答是第三个问题的答案是肯定的,他已经在公众演讲已经超过十年了。他说:”做研究最重要的是能够和其他人进行交流,无论他们是我们的同事,或者其他领域对我们感兴趣的研究者,亦或者是非科研者,清晰的交流是非常基础的”
出色的公共演讲技能对于好的研究是不够的,但是非常有用。在8月,一个来自TexasHouston的高中老师Raman J.Smith获得了2018年全球公共演讲的冠军。
下面是她的10条建议,也是她接下来出版书籍的提纲

  1. 成为你自己:要相信你就是权威;
  2. 练习,练习和练习:避免那些结巴的词语,比如额,嗯等等;
  3. 描述你想要告诉我们什么:使用形象的词来帮助关注描述一张图片;
  4. 语调语调:改变你的音调,音量来帮助观众被你所吸引;
  5. 向优秀的人学习:观察优秀的演讲者是如何做的;
  6. 获得反馈:一个有经验的观众能够帮你找出演讲中的不足;
  7. 外表:如果你看上去不错,那你就感觉不错,它能够帮你做出出色的演讲;
  8. 暂停:暂停能够给你的观众去思考,来帮助他们被吸引;
  9. 肢体语言:使用手势和充分使用空间来帮助你传达信息;
  10. 自信:使用的你的面部和肢体语言来展示你的舞台;

并不是所有的研究者意识到花时间向实验室之外的的同事讨论他们的工作。Dave Rubenson是洛杉矶nobadsides.com公司的联合创始人,他们的公司提供有效的演讲的培训课程。他说:“他们认为如果你花时间去演讲,你就是花时间在市场上,而这些时间往往能够更好的花在工作上。事实上制作一个能让你的观众理解演讲也有助于你对你工作的理解"。他还说在会议上发表演来获得同行的注意来帮助你的打破旧的视野,以及帮你在职业生涯发展,但是这个也只有他们理解你说所战士的内容。
一个好的方法是站在观众角度去思考问题,他们需要早点知道他们为什么要关心你所说的,你的演讲中有什么核心内容?为你的演讲做一个精确的总结,尽管它可能非常负载,但是在开头讲出来比你翻过500页之后再讲出来还要好。
好多演讲者失败的原因是他们尝试传递更多的复杂的信息。语言和内容,通常需要为那些非专业领域的人单独设计。你需要为你的观众中拥有最少知识的人做出考虑。
还有一个常见的错误是将幻灯片当成一种数据垃圾场,还记得你注意到一些幻灯片中包含了8张小的图片,并且想知道为什么演讲者只提起其中的一张?在你设计你自己的幻灯片的时候,记住这一点,动画软件能够帮你为你的幻灯片提供信息。
综上所述,主要的一点是维持观众的注意力
下面是一个建议用来帮你克服紧张:

  1. 在你将要演讲的环境类似环境中进行联系;
  2. 记住提纲中的关键的句子,而不是一个词一个词的记;
  3. 确保你在时间范围你,所以钟表是你需要考虑的内容;
  4. 穿那些看上去很专业的衣服;
  5. 避免过量咖啡使用;

你可以通过在演讲的幻灯片中每一节添加总结的一篇,这边可以避免思维的发散。McConnell 说:"你可以将演讲看成一系列数据流传递,你需要间歇地提出,并且说’这就是我们刚刚说学到的,下面就是结论也是和下一部分连接在一起的内容‘"
McConnell将帮助研究者提高科学演讲水平技巧总结成42分钟的在线视频。另一些建议的来源来自于美国神经学家Matt Carter在2013年一本书设计科学演讲,然后这些提共建议,大部分发现这个一旦涉及到公共演讲,练习创建完美,即是不能,也能提共更好的。
这个观念就是Toastmasters International核心观点,这是一个非盈利机构,它的目标是用来提供个人提高公共演讲能力,它们在143国家,16,000分支。在每周或者每二周,所有成员练习演讲能力,然后给出反馈。Eileen Courtney在意识到自己演讲能力需要提高,她加入了本地的分支机构。她的努力得到回报,在5月份中,她在3 Minute Wonder比赛中获得最受观众的喜爱奖,这个比赛是由伦敦已加物理研究机构,它使用一张幻灯片和180秒来向非专业观众演讲。
“我最近有一个其他的演讲,我已经冷静了很多,这个是参加Toastmasters获得结果,这个也是我博士生涯的一部分“ Courtnery 接着说:”你越在人群中做演讲获得经验,你越不会紧张“。

3 Tips

4 Share

软件工程师的职业建议这是阮一峰老师 未来世界的幸存者 书中的一篇文章。

4.1 兴趣

虽然很多人在选择职业时受到家庭、环境等方面因素的影响,不一定能从事自己非常感兴趣的工作,但是如果可能的话,一定要以兴趣为要。这样在工作时会很开心,在个人发展方面也会取得很好的成就。
因为只有兴趣才能使你乐在其中,乐在其中你才会产生热情,充满热情才能使你做到卓越。

4.2 认知

认知影响态度,态度决定一切。
侯捷老师认为,一个人在选择发展道路时,尤其重要的是要对自己有一个正确的认知。每个人的兴趣可能会变,有些人看到某个行业有发展,有前途,因此对这个行业、这条路产生很大兴趣,这是非常可能的。但是每个人的本质基本不变,你是否甘于寂寞,是否能够与寂寞为伍?你的抗压性怎样?你的毅力强不强?你的心理素质如何?这些特质都是不易改变的,而且只有你自己才能给出这些问题的准确答案。只有对自己有了正确的认知后,才能决定往哪个方向发展。
他认为,做 IT 产业非常寂寞,也非常辛苦,大家可能在周末的晚上都要加班,这就要求从事该产业的人必须甘于寂寞,具备一定的忍耐力。侯捷先生在年轻的时候非常努力,曾被称为部门的“门神”,通常都是最早来,最晚走。他认为如果一个人喜欢交际应酬,喜欢公关,就应该尽早离开这个行业,因为选择道路一定要忠实于你的本质、你的兴趣。
我补充一点,软件工程师主要跟机器打交道,而不是跟人打交道。有时,你会整整一天坐在电脑屏幕前,不说一句话,全神贯注地调试软件。所以,如果你特别喜欢社交场合,喜欢跟人互动,你可能不适合当软件工程师。

4.3 EQ

有能力读完大学的人,聪明才智基本上处于同一水平,没有人可以凭借聪明就可以取得成功。尤其是在进入社会后聪明才智已经退为次要位置,人们更重视 EQ 方面的东西,包括你的人际关系能力、沟通表达能力,抗压性、处理危机的能力等等。

4.4 学技术要掌握本质

我们在学习技术时应该注意掌握技术的本质性、不变性和可复用性。本质的东西不易变,不易变就可复用,这三者是一体的。
在接触先进的技术时,如果我们能将它的底层结构 、本质性的东西搞清楚,会给我们带来莫大的帮助。本质性、结构性的东西属于基础建设方面的问题,它对我们做项目可能不会带来直接的帮助,但在无形中会带来很大的影响,无形的通常是最宝贵的!世界上没有万变不变的手法,只有万变不变的宗旨。

4.5 刻苦修炼内功

学武的人都必须从最基本的马步、吐纳等内功方面学起,招术很重要,但如果没有内功方面的基础,招术也只能停留在基本的层面,不会到达很高的成就。
在技术追求方面也一样,我们有时候会太热心于学习业界的新技术,每一样都想沾一点。其实不必太急,基本功的东西更重要,研究得扎实一些,招术就比较容易创作了。

4.6 唯坚持得成功

坚持、毅力对一个人的成功是最重要的。有一句话说:在大树底下站久了,树阴就是你的。
侯捷老师自认才能平庸,但很能坚持。他的这个个性在朋友之间是被称道的。虽然有时坚持并不代表一定成功,但只有坚持才能有成功的机会。年轻时尽量刻苦一些,使肉体承受最大的痛苦,年龄稍大一些的时候才能享受成果。有一句话“退一步海阔天空”,但侯捷先生更希望大家“撑一下海阔天空”,一试再试做不成,再试一下。

4.7 不要别人点什么,就做什么

尼古拉斯.泽卡斯的第一份工作,只干了8个月,那家公司就倒闭了。他问经理,接下来他该怎么办,经理说:

”小伙子,千万不要当一个被人点菜的厨师,别人点什么,你就烧什么。不要接受那样一份工作,别人下命令你该干什么,以及怎么干。你要去一个地方,那里的人肯定你对产品的想法,相信你的能力,放手让你去做。“

他从此明白,单单实现一个产品是不够的,你还必须参与决定怎么实现。好的工程师并不仅仅服从命令,而且还给出反馈,帮助产品的拥有者改进它。

4.8 推销自己

泽卡斯进入雅虎公司以后,经理有一天跟他谈话,觉得他还做得不够。

”你工作得很好,代码看上去不错,很少出Bug。但是,问题是别人都没看到这一点。为了让其他人相信你,你必须首先让别人知道你做了什么。你需要推销自己,引起别人的注意。“

他这才意识到,即使做出了很好的工作,别人都不知道,也没用。做一个角落里静静编码的工程师,并不可取。你的主管会支持你,但是他没法替你宣传。公司的其他人需要明白你的价值,最好的办法就是告诉别人你做了什么。一封简单的 Email:”嗨,我完成了 XXX,欢迎将你的想法告诉我“,就很管用。

4.9 学会带领团队

工作几年后,已经没人怀疑泽卡斯的技术能力了,大家知道他能写出高质量的可靠代码。有一次,他问主管,怎么才能得到提升,主管说:

”当你的技术能力过关以后,就要考验你与他人相处的能力了。“

于是,他看到了,自己缺乏的是领导能力,如何带领一个团队,有效地与其他人协同工作,取到更大的成果。

4.10 生活才是最重要的

有一段时间,泽卡斯在雅虎公司很有挫折感,对公司的一些做法不认同,经常会对别人发火。他问一个同事,后者怎么能对这种事情保持平静,同事回答:

”你要想通,这一切并不重要。有人提交了烂代码,网站下线了,又怎么样?工作并不是你的整个生活。它们不是真正的问题,只是工作上的问题。真正重要的事情都发生在工作以外。我回到家,家里人正在等我,这才重要啊。“

从此,他就把工作和生活分开了,只把它当作“工作问题”看待。这样一来,对工作就总能心平气和,与人交流也更顺利了。

4.11 自己找到道路

泽卡斯被提升为主管以后,不知道该怎么做。他请教了上级,上级回答:

”以前都是我们告诉你做什么,从现在开始,你必须自己回答这个问题了,我期待你来告诉我,什么事情需要做。“

很多工程师都没有完成这个转变,如果能够做到,可能就说明你成熟了,学会了取舍。你不可能把时间花在所有事情上面,必须找到一个重点。

4.12 把自己当成主人

泽卡斯每天要开很多会,有些会议根本无话可说。他对一个朋友说,我不知道自己为什么要参加这个会,也没有什么可以贡献,朋友说:

”不要再去开这样的会了。你参加一个会,那是因为你参与了某件事。如果不确定自己为什么要在场,就停下来问。如果这件事不需要你,就离开。不要从头到尾都静静地参加一个会,要把自己当成负责人,大家会相信你的。“

从那时起,他从没有一声不发地参加会议。他确保只参加那些需要他参加的会议

Comments
Write a Comment