给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。

  1. 输入:nums = [2,7,11,15], target = 9
  2. 输出:[0,1]
  3. 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]

解题思路

创建一个HashTable,将nums的元素作为key,将元素索引作为value。其次遍历nums元素,再在HashTable中寻找target-x,如果找到了就返回由这两个索引组成的数组,如果没找到就继续找。

const twoSum = function(nums, target) {
    const hashTable = new Map()
    for(let i = 0;i<nums.length;i++){
        let index = hashTable.get(target-nums[i])
      if(index!==undefined){
          return [index,i]    
      }
      hashTable.set(nums[i],i)
    }
      return []
};

Go

复习语法:HashMap的初始化;数组的初始化;for range 的用法,第一个参数是index,第二个参数是元素;在hashTable中去一个元素的时候,第一个参数是值,第二个参数是是否取出;

func twoSum(nums []int,target int) []int{
    hashTable := map[int]int{}
    for i,x := range nums {
        if p,ok := hashTable[target-x];ok{
            return []int{i,p}
        }
        hashTable[x]=i
    }
    return nil
}

Rust

复习语法:HashMap的初始化,以及get,insert语法;get出来的值是Option所以要使用if let或者match,取出的值还需要解引用,因为get的时候传的就是引用;

use std::collections::HashMap;

impl Solution {
    pub fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
        let mut hashTable = HashMap::new();
        for i in 0..nums.len() {
            if let Some(index) = hashTable.get(&(target-nums[i])){
                return vec![*index,i as i32]
            };
            hashTable.insert(nums[i],i as i32);
        };
        return vec![]
    }
}