1.两数之和

变量解释:

nums:存数组的向量
target:目标和
i:指向nums的向量首指针,迭代器
j:指向nums的向量尾指针,迭代器
m:指代nums的位置,为存答案所需位置于values向量做伏笔,初值为0
n:指代nums的位置,为存答案所需位置于values向量做伏笔,初值为nums.size()-1
values:twoSum函数中的局部变量,暂时存答案,返回给main
_________________________________________________________________________________________
引用型形参nums接收来自主函数传来的数组,整形形参target接受来自主函数设定的和。

迭代器i指向nums的首元素,是向量首指针;j指向末元素(注:因为nums.end()存的是向量尾指针,指向向量最后一个元素的下一个位置,故需nums.end()-1才指向nums的最后一个元素,若不减一,j的取值将为-1。)

m初始化为nums的首元素所处的位置,初值为0;

n初始化为nums的末元素所处的位置,初值为nums.size()-1。

从两个方向遍历nums:

                 当找到第一个答案对应位置时将用values.push_back(m)将第一个位置m存入values【0】

                  当找到第二个答案对应位置时将用values.push_back(n)将第二个位置n存入values【1】

当两个答案所需位置都找到时返回主函数调用位置。

(注:leetcode中不用写主函数main,否则报错“previous definition is here”)

源代码:

#include<vector>
#include<iostream>
using namespace std;
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {

vector<int> values;     //存答案位置
int m=0;
vector<int>::iterator i=nums.begin();
for(;m<nums.size();m++)
{
vector<int>::iterator j=nums.end()-1;
for(int n=nums.size()-1;n>0;n--)
{
if((*i+*j==target)&&(m!=n))
{ values.push_back(m);
values.push_back(n);
return values;
} j--;
} i++;
}

return values;}
};

int main()
{ Solution s;
int n,target;
vector<int> nums;
vector<int> value;
while(cin>>n)
{
nums.push_back(n);
if(cin.get()=='\n')
break;
}
cin>>target;
value=s.twoSum(nums,target);
cout<<'[';
for(int p=0;p<value.size();p++)
{ cout<<value[p];
if(p!=value.size()-1)
cout<<",";
}
cout<<']';
return 0;
}

运行截图:

 

iterator和vector之前不懂又不去学,被第一题拦住了就不再尝试了,今天再一次尝试,还是可以做到的。

 还有调试,之前不懂也不学,靠着在程序内安插一些变量和输出语句来看程序运行位置、运行状态等,真是太麻烦了,今天网上一搜一学,调试真香

 
posted @ 2021-12-27 21:59  九月天9  阅读(44)  评论(0)    收藏  举报