1. 程式人生 > 其它 >集合(3):Collection下的子介面:List介面

集合(3):Collection下的子介面:List介面

變數解釋:

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之前不懂又不去學,被第一題攔住了就不再嘗試了,今天再一次嘗試,還是可以做到的。

還有除錯,之前不懂也不學,靠著在程式內安插一些變數和輸出語句來看程式執行位置、執行狀態等,真是太麻煩了,今天網上一搜一學,除錯真香