第 79 期:让 AI 帮你记录生活

@Author : Lewis Tian (taseikyo@gmail.com)

@Link : github.com/taseikyo

@Range : 2024-09-08 - 2024-09-14

Weekly #79

readme | previous | next

本文总字数 4029 个,阅读时长约: 5 分 47 秒,统计数据来自:算筹字数统计

*Photo by Tunafish on Unsplash

Table of Contents

  • algorithm

    • 两数之和

    • 两数相加

    • 无重复字符的最长子串

    • 寻找两个正序数组的中位数

  • tip

    • Sublime Text 3 快速生成文件头部注释

  • share

    • 让 AI 帮你记录生活

algorithm 🔝

题目

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

解答

twosum.go

func twoSum(nums []int, target int) []int {
    cache := make(map[int]int)
    for idx, val := range nums {
        if preIdx, ok := cache[target-val]; ok {
            return []int{preIdx, idx}
        }
        cache[val] = idx
    }

    return []int{}
}

数据:0ms 100%; 5.71MB 45.42%

题目

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

解答

addtwonumbers.go

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
	overflow := (l1.Val + l2.Val) / 10
	res := &ListNode{}
    res.Val = (l1.Val + l2.Val) % 10
	head := res
    l1 = l1.Next
    l2 = l2.Next
	for l1 != nil || l2 != nil || overflow > 0 {
        res.Next = &ListNode{}
        res = res.Next
        res.Val += overflow
        if l1 != nil {
            res.Val += l1.Val
            l1 = l1.Next
        }
        if l2 != nil {
            res.Val += l2.Val
            l2 = l2.Next
        }
		overflow = res.Val / 10
		res.Val = res.Val % 10
	}

	return head
}

数据:0ms 100%; 6.01MB 55.28%

题目

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。

示例 1:

输入: s = "abcabcbb"

输出: 3

解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"

输出: 1

解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"

输出: 3

解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

提示:

  • 0 <= s.length <= 5 * 104

  • s 由英文字母、数字、符号和空格组成

解答

longestsubstringwithoutrepeatingcharacters.go

func lengthOfLongestSubstring(s string) (ans int) {
	for i, j := 0, 0; j < len(s); j++ {
		for strings.Contains(s[i:j], string(s[j])) {
			i++
		}
		ans = max(ans, j-i+1)
	}
	return
}

数据:3ms 78.90%; 4.21MB 97.97%

题目

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 `O(log (m+n))`` 。

示例 1:

输入:nums1 = [1,3], nums2 = [2]

输出:2.00000

解释:合并数组 = [1,2,3] ,中位数 2

示例 2:

输入:nums1 = [1,2], nums2 = [3,4]

输出:2.50000

解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

提示:

  • nums1.length == m

  • nums2.length == n

  • 0 <= m <= 1000

  • 0 <= n <= 1000

  • 1 <= m + n <= 2000

  • -106 <= nums1[i], nums2[i] <= 106

解答

medianoftwosortedarrays.go

func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
	len1, len2 := len(nums1), len(nums2)
    if len1 == 0 {
		return mid(nums2)
	}
    if len2 == 0 {
        return mid(nums1)
    }
    nums := make([]int, len1+len2)
    i, j, k := 0, 0, 0
    for i < len1 || j < len2 {
        if i < len1 && j < len2 {
            if nums1[i] < nums2[j] {
                nums[k] = nums1[i]
                i++
            } else {
                nums[k] = nums2[j]
                j++
            }
        } else if i < len1 {
            nums[k] = nums1[i]
            i++
        } else {
            nums[k] = nums2[j]
            j++
        }
        k++
    }

    return mid(nums)
}

func mid(nums []int) float64 {
	numLen := len(nums)
	if numLen == 0 {
		return 0
	}

	if numLen%2 == 0 {
		return float64(nums[numLen/2-1] + nums[numLen/2]) / 2
	}

	return float64(nums[numLen/2])
}

数据:0ms 100%; 6.67MB 26.02%

review 🔝

tip 🔝

1. Sublime Text 3 快速生成文件头部注释

  • https://github.com/kairyou/SublimeTmpl

主要使用这个插件进行生成,可以修改快捷键进行绑定不同的文件,比如把 ctrl+alt+c 改成是 创建 C/C++ 文件,同时需要去 Packages\SublimeTmpl\templates 目录下补充相应的模板文件。

share 🔝

1. 让 AI 帮你记录生活

想法来自阮一峰的周刊:你一生的故事

随身佩戴一个摄像头,每隔一段时间,自动或手动对着周围环境,拍一张照片。

然后将这张照片发送到 OpenAI,让 AI 根据预先设置的提示词,用传记的作者的口吻,为照片生成一段描述。

他用树莓派 + 摄像头 + 打印的外壳,做出了一个这样的装置,只要佩戴在身上,就会定时把周围环境的照片发送到 OpenAI。

提示词:

你是一部关于张三的电影的叙述者。张三的年龄为20岁,所在城市为上海。当你看到附件的场景照片时,应该从张三的角度描述这张照片,所有人物都使用第三人称。

测试:

把照片和提示词一起发给 OpenAI,下面就是返回的描述:

在这张照片中,张三站在熙熙攘攘的上海街头,他的眼光落在了“杨氏煎饺”的招牌上。街道上人群络绎不绝,从周围匆匆走过的行人到排队等待的食客们,每个人都沉浸在自己的小世界里。队伍前的人们耐心地等待着品尝这家声名远扬的小吃,而张三对这一幕并不陌生。这不仅仅是一条普通的街道,对他来说,这里充满了家的味道和温暖的回忆。

街道两侧的建筑展示了上海的传统与现代的融合,老旧的石库门建筑与现代的招牌交相辉映。电线杆上纵横交错的电线像是城市生活的复杂脉络。尽管张三已经习惯了这种忙碌的城市生活,但每次路过这样的街景,心中总会涌起一丝慰藉。

在这繁忙的一天里,张三像往常一样穿梭在这座大都市的心脏地带,尽管他只是其中的一员,但这座城市的每一个角落都承载着他的故事和梦想。

很有趣不是吗,甚至以后出门旅游拍完照片发朋友圈前,先发给 OpenAI,让它来生成一段记录。

readme | previous | next

最后更新于

这有帮助吗?