2019独角兽企业重金招聘Python工程师标准>>>
问题描述
给定一个整型数组,找出加起来为给定结果的两个数字所在数组的下标。 假定每次给定的数据只能有一个答案,并且同一数字不能使用两次。 示例:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
个人版本
解题思路:
遍历整个数组,当发现当前数字大于结果时,排除。如果小于或等于时,使用给定结果减去当前数字得到结果a,然后遍历剩余数字,如果发现有等于a的数字时,则表明找到结果;如果遍历未找到,则继续该流程。最好的情况,遍历一次;最坏的情况,遍历数组元素个数减1次。
代码(Java版本)
public int[] twoSun(int[] sourceNumbers, int target) {
int[] result = new int[2];
int position = 0;
final int arrayLength = sourceNumbers.length;
boolean isFound = false;
for (int i : sourceNumbers) {
if (i <= target) {
int numToFind = target - i;
for (int j = position + 1; j < arrayLength; j++) {
if (numToFind == sourceNumbers[j]) {
result[0] = position;
result[1] = j;
isFound = true;
break;
}
}
}
if (isFound) {
break;
}
position++;
}
return result;
}
票数最高版本
解题思路
利用了Java中Map的key不能重复的特性,遍历一次即可找出结果。
代码(Java版本)
public int[] twoSum(int[] numbers, int target) {
int[] result = new int[2];
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < numbers.length; i++) {
if (map.containsKey(target - numbers[i])) {
result[1] = i + 1;
result[0] = map.get(target - numbers[i]);
return result;
}
map.put(numbers[i], i + 1);
}
return result;
}
总结
通过上述比较,可见对于算法和语言特性需要进一步深入的了解,后期遇到问题也会比较容易通过已有途径进行快速解决。