anAlgorithmADay_twoSum.ts

68 阅读1分钟
interface Test {
    nums: number[];
    target: number;
    result: number[];
}

class LeetCodeProgram_TwoSum {

/**
* 给定一个整数数组 nums 和一个整数目标值 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]
*
*
*
*
*/
    private test_arr: Test[] = [
        {
            nums: [2,7,11,15],
            target: 9,
            result: [0,1],
        }
        {
            nums: [3,2,4],
            target: 6,
            result: [1,2],
        }  
        {
            nums: [3,3],
            target: 6,
            result: [0,1],
        }  
    ] 
    /*
    * indexOf的思路实现两数之和,未排除自身索引
    */
    private function twoSum1(nums: number[], target: number): number[] {
        const _length = nums.length;
        for (let i: number = 0; i < _length; i++) {
            const _differenceValue = target - nums[i];
            const _differenceValue_index = nums.indexOf(_differenceValue);
            if (_differenceValue_index !== -1) {
                return [i, _differenceValue_index];
           }
        }
        return [];
    }    
    /*
    * indexOf的思路实现两数之和,排除自身索引
    */
    private function twoSum2(nums: number[], target: number): number[] {
        const _length: number = nums.length;
        for (let i: number = 0; i < _length; i++) {
            const _differenceValue: number = target - nums[i];
            const _differenceValue_index: number = nums.indexOf(_differenceValue);
            if (_differenceValue_index !== -1 && _differenceValue_index !== i) {
                return [i, _differenceValue_index];
            }
        }
        return [];
    }
    /*
    * map的思路实现两数之和,未排除自身索引
    */
    private function twoSum3(nums: number[], target: number): number[] {
        let map = new Map();
        for(let i=0;i<nums.length;i++){
            if(map.has(target-nums[i])){
                return [i, map.get(target-nums[i])]
            }else{
                map.set(nums[i], i)
            }  
        }
        return [];
    }
    public function commit(funcName: string) {
        this.test_arr.forEach((test: Test) => {
            const {nums, target, result} = test;
            const _arr = this[funcName](nums, target);
            if (!!_arr.length && _arr[0] === result[0] && _arr[1] === result[1]) { // TODO: 这里要封装一个对比两数组是否相等的方法
                console.log(`${funcName}与结果一致`);
            } else {
                console.log(`${funcName}与结果不一致`);
            }
        });
    }

}

const leetCodeProgram_TwoSum = new LeetCodeProgram_TwoSum();
leetCodeProgram_TwoSum.commit('twoNum1');

提交记录

42 / 52 个通过测试用例

状态:解答错误

输入:

[3,2,4] 6

输出:

[0,0]

预期:

[1,2]

leetCodeProgram_TwoSum.commit('twoNum2');

提交记录

52 / 52 个通过测试用例

状态:通过

执行用时: 100 ms

内存消耗: 40 MB

leetCodeProgram_TwoSum.commit('twoNum3');

提交记录

52 / 52 个通过测试用例

状态:通过

执行用时: 84 ms

内存消耗: 40.3 MB