Skip to content

Latest commit

 

History

History
55 lines (41 loc) · 1.31 KB

File metadata and controls

55 lines (41 loc) · 1.31 KB

两数之和题解

题目要求不要用两个for语句,会超出时间限制

第一部分

func sum(n []int, t int) int {
	r := make(map[int]int)
	for k, v := range n {
		if _, ok := r[t-v]; ok == true {
			fmt.Println(r[t-v], k)
			return 0
		} else {
			r[v] = k
		}
	}
	return 0
}

r的操作是生成哈希表,k是代表第几个数,v代表该数的值

判断语句中因为哈希表的返回值就等于r[t-v],所以没必要保留,用__代替

如果之前的数哈希表有过记录,即ok为true,则输出并退出函数,无记录则记录并进入下一个数的循环


第二部分

func main() {
	s := bufio.NewScanner(os.Stdin)
	s.Scan()
	input := s.Text()
	u := strings.Split(input, " ")
	var numbers []int
	for _, uu := range u {
		num, _ := strconv.Atoi(uu)
		numbers = append(numbers, num)
	}
	fmt.Scan(&target)
	sum(numbers, target)
}

因为输入的整数的个数是不确定的,所以可用字符串表示,再转化成整数

u表示一个装有去掉空格的各个字符串的切片(如输入2 7 9 11,则u为[2,7,9,11])

for语句因为不需要下标值,所以用__,代替

第八行则是将每个切片的字符串转化为整数并存入num中,__ ,处是防止转化的数不是整数,对于这道题不需要,故用__,替代