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