程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

2025-06-30:按下时间最长的按钮。用go语言,你给了我一个二维数

balukai 2025-07-14 14:48:58 文章精选 2 ℃

2025-06-30:按下时间最长的按钮。用go语言,你给了我一个二维数组 events,里面每个元素 events[i] = [按钮编号, 按下时间],代表在某个时刻按下了哪个按钮。

数组按时间从小到大排列。

每个按钮按下所花费的时间,等于当前按下时刻和上一次按下的时间差;第一个按钮按下的耗时就是它的时间戳本身。

你需要找出耗时最长的按钮编号。如果有多个按钮耗时相同,返回编号最小的那个。

1 <= events.length <= 1000。

events[i] == [indexi, timei]。

1 <= indexi, timei <= 100000。

输入保证数组 events 按照 timei 的递增顺序排序。

输入: events = [[10,5],[1,7]]。

输出: 10。

解释:

下标为 10 的按钮在时间 5 被按下。

下标为 1 的按钮在时间 7 被按下,因此按下时间为 7 - 5 = 2。

最终,下标为 10 的按钮按下时间最长,为 5。

题目来自力扣3386。

解决步骤

  1. 1. 初始化
  2. o 第一个按钮的按下时间就是它的时间戳 events[0][1],因此初始时最长按下时间的按钮编号是 events[0][0],最长按下时间是 events[0][1]
  3. 2. 遍历后续按钮
  4. o 从第二个按钮开始(i = 1i = len(events) - 1),计算当前按钮的按下时间:
  5. o 当前按钮的按下时间 = 当前按钮的时间戳 events[i][1] - 前一个按钮的时间戳 events[i-1][1]
  6. o 比较当前按钮的按下时间与已知的最大按下时间:
  7. o 如果当前按下时间大于最大按下时间,更新最大按下时间和对应的按钮编号。
  8. o 如果当前按下时间等于最大按下时间,且当前按钮编号小于已知的按钮编号,更新按钮编号(确保编号最小)。
  9. 3. 返回结果
  10. o 遍历完成后,返回记录的最长按下时间对应的按钮编号。

复杂度分析

  • o 时间复杂度O(n),其中 nevents 的长度。我们只需要遍历一次 events 数组。
  • o 额外空间复杂度O(1),只使用了常数级别的额外空间(如 idxmaxDiff 变量)。

Go完整代码如下:

.

package main

import (
    "fmt"
)

func buttonWithLongestTime(events [][]int)int {
    idx, maxDiff := events[0][0], events[0][1]
    for i := 1; i < len(events); i++ {
        p, q := events[i-1], events[i]
        d := q[1] - p[1]
        if d > maxDiff || d == maxDiff && q[0] < idx {
            idx, maxDiff = q[0], d
        }
    }
    return idx
}

func main() {
    events := [][]int{{10, 5}, {1, 7}}
    result := buttonWithLongestTime(events)
    fmt.Println(result)
}


Python完整代码如下:

.

# -*-coding:utf-8-*-

defbutton_with_longest_time(events):
    idx, max_diff = events[0][0], events[0][1]
    for i inrange(1, len(events)):
        p, q = events[i-1], events[i]
        d = q[1] - p[1]
        if d > max_diff or (d == max_diff and q[0] < idx):
            idx, max_diff = q[0], d
    return idx

if __name__ == "__main__":
    events = [[10, 5], [1, 7]]
    result = button_with_longest_time(events)
    print(result)



·



我们相信Go语言和算法为普通开发者提供了困境的“面试利器”,并致力于分享全面的编程知识。在这里,您可以找到最新的Go语言教程、算法解析、提升面试竞争力的秘籍以及行业动态。


欢迎关注“福大规模架构师每日一题”,让 Go 语言和算法助力您的职业发展

·

Tags:

最近发表
标签列表