ARTS 第22周分享
[TOC]
Algorithm
274. H-Index
[medium]
[题目描述]
Given an array of citations (each citation is a non-negative integer) of a researcher, write a function to compute the researcher's h-index.
According to the definition of h-index on Wikipedia: "A scientist has index h if h of his/her N papers have at least h citations each, and the other N − h papers have no more than h citations each."
Example 1:
Input: citations = [3,0,6,1,5]
Output: 3
Explanation: [3,0,6,1,5] means the researcher has 5 papers in total and each of them had
received 3, 0, 6, 1, 5 citations respectively.
Since the researcher has 3 papers with at least 3 citations each and the remaining
two with no more than 3 citations each, her h-index is 3.
[解题思路]
- 先将论文根据引用次数从大到小排序
- 找到引用次数
[参考代码]
type myInts []int
func (is myInts) Len() int {
return len(is)
}
func (is myInts) Less(i, j int) bool {
return is[i] > is[j]
}
func (is myInts) Swap(i, j int) {
is[i], is[j] = is[j], is[i]
}
func HIndex(ci []int) int {
return hIndex(ci)
}
func hIndex(citations []int) int {
/*
// 先对数组进行从大到小排序,
// 根据index指数的特点,找到最大的索引+1等于本身值的这个值即可
*/
// 先对数组进行从大到小排序,
var c myInts
c = citations
sort.Sort(c)
var max int
if c.Len() >= 1 {
if c[0] > 0 {
max = 1
}
}
for i := 0; i < c.Len(); i++ {
if c[i] >= i+1 {
max = i+1
} else {
return max
}
}
return max
}
Review
Learning to Use Go Reflection: https://medium.com/capital-one-tech/learning-to-use-go-reflection-822a0aed74b7
golang reflect的基本使用方法,以及局限性
Tips
golang类型别名
- 类型别名和原类型完全一样,只不过是另一种叫法而已
- 你可以为任意的类型定义类型别名,语言规范中没有限制,可以为数组、结构体、指针、函数、接口、Slice、Map、Channel定义别名,甚至你还可以为通过类型定义(type definition)的类型定义别名,更甚者是你可以为别名定义别名。
- 完全一样(identical types)意味着这两种类型的数据可以互相赋值,而类型定义要和原始类型赋值的时候需要类型转换(Conversion T(x))。
- 类型别名和类型定义最大的区别在于:类型别名和原类型是相同的,而类型定义和原类型是不同的两个类型。
- 既然类型别名和原类型是相同的,那么在`switch - type中,你不能将原类型和类型别名作为两个分支,因为这是重复的case
- 如果定义的类型别名是exported (首字母大写)的,那么别的包中就可以使用,它和原始类型是否可exported没关系 --> (用于将不可导出类型变成可导出类型)
- 既然类型别名和原始类型是相同的,那么它们的方法集也是相同的
- 在Go 1.9中, 内部其实使用了类型别名的特性。 比如内建的byte类型,其实是uint8的类型别名,而rune其实是int32的类型别名
share
做技术最怕埋头苦干:https://mp.weixin.qq.com/s/dV3Zu2tVV1bP7QwHomTBwQ
-
在职场应该发展自身的:自我表现和不可替代性,
自我表现是要证明自己,让公司发现自己的价值。
如果价值特别大,大到其他人不好替代,那这样一来,自我表现的本质还是为了不可替代性。
首先要到公司的核心业务中去
-
积极在团队内部做分享,去研究一些有价值的技术,或者发表下自己对当前业务的思考,这些都可以为你贴上一些标签:
“这个人看起来技术不错的样子”
“这个人看起来对业务理解很深的样子”
“这个人看起来很有工作激情” -
多担责,也可以提高自己的不可替代性,
在公司的协作开发中,一般都是每个人负责自己的一个模块,大家都不愿意去管其他模块的事情。但其实对于一个有追求的人来说,确实要多担责,因为这样一来就可以对业务有更全局的了解,就能够发掘别人看不到的闪光点,久而久之,就可以成长为团队里的业务能手,遇到问题时只有你最清楚,那大家对你的印象就会不错,一提到你,就联想到业务能手这个标签。
人一定要有一些正向的特点,能够让周围人对你留下深刻印象,人最怕默默无闻,默默无闻的后果就是好事轮不到,坏事跑不了。人一旦有一些标签后,那就有了一定的不可替代性
我个人觉得哈,人一定要曝光自己,一定要创造一些机会来站在舞台上展示自己。
如果这一年来,你从来都是默默无闻地写代码,工作平淡无奇,没有一丝涟漪,也没有任何高光时刻,那就可以反思下了。
webSocket 介绍: https://mp.weixin.qq.com/s/gasQHCRj5RutsBe0zbSTFg
WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。
它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。
提供一个主动通达客户端的能力,通过一种方式实现,多种不同平台(H5/Android/IOS)去使用
-
webSocket建立过程:
- 客户端发起升级协议的请求,采用标准的HTTP报文格式,在报文中添加头部信息
Connection:Upgrade表明连接需要升级 Upgrade:websocket需要升级到 websocket协议 Sec-WebSocket-Version:13 协议的版本为13 Sec-WebSocket-Key:I6qjdEaqYljv3+9x+GrhqA== 这个是base64 encode 的值,是浏览器随机生成的,与服务器响应的 Sec-WebSocket-Accept对应
- 服务器响应升级协议
服务端接收到升级协议的请求,如果服务端支持升级协议会做如下响应
返回:
StatusCode:101SwitchingProtocols
表示支持切换协议- 升级协议完成以后,客户端和服务器就可以相互发送数据
websocket是双向的数据通讯,可以连续发送,如果发送的数据需要服务端回复,就需要一个seq来确定服务端的响应是回复哪一次的请求数据
本周阅读
第四周:1, 5, 7
Go Modules踩坑总结: https://mp.weixin.qq.com/s/2v8kGm8T9BQFmpLfQE7-wg
数据库用数值保存时间戳: https://mp.weixin.qq.com/s/2B1VwPn9u6U-GHwWspXj6A
我是如何通过开源项目月入 10 万的?: https://mp.weixin.qq.com/s/Pif-0wJao54Bf5qqRTFVIQ
Nginx 所使用的 epoll 模型是什么 https://mp.weixin.qq.com/s/VzxtmZ3sMiW3ClW5fxrb6g
低效程序员的5个坏习惯: https://mp.weixin.qq.com/s/hM6jY-9v_skXKGF5Y38mtA
做技术最怕埋头苦干: https://mp.weixin.qq.com/s/dV3Zu2tVV1bP7QwHomTBwQ
有疑问加站长微信联系(非本文作者)