这学期一直,没更新博客,一是因为这学期的java课太水了,根本没有写的必要,二是这学期写的最多的代码是verilog,因为我选的计组老师是安建峰,他每次留的大作业我都尽力完成了,确实对充分理解mips处理器有很大帮助,可能过几天我就会把计组的东西发上来,也算留个念吧。
这转眼都该大三了,其实还是有些彷徨的,并不知道自己到底要干些什么,舍友校内获了一堆奖,而我却一个都没有,虽然以后想从事游戏方面的工作,但是却找不到努力的方向,所以想着暑假刷点题,充实一下自己。
看下题吧,第一道:
首先想到的肯定是写两个循环,但是其实还有其他的办法,可以利用dictionary的键值对来解决。
题中所述“每种输入只会对应一个答案”说明答案是唯一的,不会出现【3,3,4】,7的这种情况。
体重所述“你不能重复利用这个数组中同样的元素”说明【3,4】,6的情况时是没有结果的,因为0号位置的值不可以用两次,而【3,3,4】,6是有结果的。
利用键值对,通过值来查找下标,可以快速的得到所需值得下标,而不用循环查找。
public class Solution {
public int[] TwoSum(int[] nums, int target)
{
Dictionary<int, int> dictionary = new Dictionary<int, int>();
for (int i = 0; i < nums.Length; i++)
{
int key = target - nums[i];//计算要查找的key值
if (dictionary.ContainsKey(key))//如果字典里有,说明以前存进的其中一个和将要存进的的和为target
{
return new int[] { dictionary[key], i };//存在就返回
}
else
{
dictionary[nums[i]] = i;//不存在就存入
}
}
throw new Exception("Do not have the right result.");
}
}
我第一次写的时候是先存入dictionary,再查找,为了避免出现键重复的情况,值我使用了list。但是其实是可以向上面一样边存边找的,因为结果是唯一的,这样就可以节省一些时间。