Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
参加了一个面试,被问了两数之和的问题,一开始我还以为是要用什么复杂的算法和处理,自己还想搞什么排序啥的。
今天看了下力扣才发现,就是题库里的第二题。简单问题复杂化,可真坑。
题目描述:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
思路分析:
两层循环,第一层循环加数,第二层循环被加数,和等于目标值时返回结果。
效率也提高不了多少,最多是内层循环从外层的下标加1开始循环,然后找到下标时不执行完所有循环直接返回结果。
AC 代码:
使用个人喜欢的 go ,感觉代码真的好简洁!
package main
import "fmt"
func twoSum(nums []int, target int) []int {
var index []int
var l = len(nums)
for i := 0; i < l; i++ {
a := nums[i]
for j := i + 1; j < l; j++ {
if a+nums[j] == target {
index = append(index, i)
index = append(index, j)
return index
}
}
}
return nil
}
func main() {
nums := []int{2, 7, 11, 15}
target := 25
index := twoSum(nums, target)
if index != nil {
fmt.Println(index)
} else {
fmt.Println("未找到对应下标")
}
}
复制代码
总结:
面试时我是真想多了,当时回答是下面这样的。
先定义个结构体,结构体里定义两个属性,一个是值,一个是下标。
先循环一遍,把数组各元素转换为结构体的数组,然后再按照值进行排序。
然后从第一个元素的值(加数)开始循环,二分查找目标值减去的结果值。
找到后,再取出两个元素的下标。
现在想想,简直是脑洞开到了天际。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END