1.Two Sum题目和答案详解

1题目简述

       给定一组整数,将两个数的返回指数相加,使它们相加成一个特定的目标。以下为所举的例子:

Given nums = [2, 7, 11, 15], target = 9,

 

Because nums[0] + nums[1] = 2 + 7 = 9,

return [0, 1].

 

2答案详解
(1) 解决思想

  C++相对与C语言的一个重要的特点是:面向对象编程(OOP),故我们采用类的方法来实现所述要求。

给定的整型数组可以用容器vector<int>vec来表示,两数之和可以定义为int类型变量target。因此,所设计的类的构造函数中形参列表为接收一个容器实参和一个整型实参。该类中可以定义一个方法:该方法找到第一次符合条件的两个数的下标,并将这两个下标放入一个容器vector<int>res中,并按值返回这个容器。否则,按值返回一个空的容器。

  找符合条件的两个数下标的方法:因为给定数组用容器来表示,则可以定义两个迭代器itf(first)和its(second)。将itf赋值为数组的开始位置,并往后遍历;当找到<=两数之和的元素时,将its赋值为itf的下一个位置,并往后遍历;当its找到等于两数之和减去*itf的元素时,将*itf和*its放入res中,并返回res;若没有符合的元素,将itf继续往后遍历,以此类推,直到遍历完整个数组为止。

(2) 设计程序

  所设计的程序采用类模板,这样可以将该题目延伸到针对浮点型的数组,程序如下:

#include <iostream>
#include <vector>
#include <iterator>

using std::vector;
using std::iterator;
using std::cout;
using std::endl;


template<class T>
class TwoSum
{
private:
    vector<T> nums_;
    T target_;
public:
    TwoSum(const vector<T>& nums,T target):nums_(nums),target_(target) {}
    TwoSum() {}
    vector<int> result();
};

template<class T>
vector<int> TwoSum<T>::result()
{
    vector<int> res;
    typename vector<T>::iterator itf_;
    typename vector<T>::iterator its_;
    for(itf_ = nums_.begin(); itf_ != nums_.end(); itf_++) {
        if(*itf_ <= target_) {
            for(its_ = itf_ + 1; its_ != nums_.end(); its_++) {
                if(*its_ == (target_  - *itf_)) {
                    res.push_back(distance(nums_.begin(),itf_));
                    res.push_back(distance(nums_.begin(),its_));
                    return res;
                }
            }
        }
    }
    cout << "Not Find!" << endl;
    return res;
}



int main()
{
    int arr[]= {1,2,3,4,5,11};
    vector<int> vec(arr,arr+6);
    vector<int> rs;
    TwoSum<int> ts(vec,9);
    rs = ts.result();
    vector<int>::iterator it = rs.begin();
    while(it != rs.end()) {
        cout << *it++ << ' ';
    }
    cout << endl;
 }
程序运行结果为:3  4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值