自己当笔记写着玩吧--leetcode- 001

两数之和问题

由于Leetcode上关于C++只有接口函数,而自己水平又实在不行,就当做一步一步理解吧
如题:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

附上代码:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <sstream>

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

        vector<int> a(2,0);
        for(int i = 0; i<nums.size()-1; i++)
        {
            for(int j=i+1; j < nums.size(); j++)
            if(nums[j] == target-nums[i] )
            {
              a[0]=i;
              a[1]=j;
            }
        }
         return a;
    }
};

void trimLeftTrailingSpaces(string &input) {
    input.erase(input.begin(), find_if(input.begin(), input.end(), [](int ch) {
        return !isspace(ch);
    }));
}

void trimRightTrailingSpaces(string &input) {
    input.erase(find_if(input.rbegin(), input.rend(), [](int ch) {
        return !isspace(ch);
    }).base(), input.end());
}

vector<int> stringToIntegerVector(string input) {
    vector<int> output;
    trimLeftTrailingSpaces(input);
    trimRightTrailingSpaces(input);
    input = input.substr(1, input.length() - 2);
    stringstream ss;
    ss.str(input);
    string item;
    char delim = ',';
    while (getline(ss, item, delim)) {
        output.push_back(stoi(item));
    }
    return output;
}

int stringToInteger(string input) {
    return stoi(input);
}

string integerVectorToString(vector<int> list, int length = -1) {
    if (length == -1) {
        length = list.size();
    }

    if (length == 0) {
        return "[]";
    }

    string result;
    for(int index = 0; index < length; index++) {
        int number = list[index];
        result += to_string(number) + ", ";
    }
    return "[" + result.substr(0, result.length() - 2) + "]";
}

int main() {
    string line;
    while (getline(cin, line)) {
        vector<int> nums = stringToIntegerVector(line); //输入第一行字符串转换成整型
        getline(cin, line);
        int target = stringToInteger(line);

        vector<int> ret = Solution().twoSum(nums, target);

        string out = integerVectorToString(ret);
        cout << out << endl;
    }
    return 0;
}

既然一步一步分析,就开始从main()函数了解,首先声明了一个字符串常量line,用来接收输入信息;遇到了第一个不熟悉的。

  1. getline(cin, line)

  2. stringToIntegerVector(line)
    -----> trimLeftTrailingSpaces(input)
    ----------> input.erase();
    --------------->find_if(input.begin(), input.end(), [](int ch) { return !isspace(ch);
    -----> input.substr(1, input.length() - 2)

  3. Solution().twoSum(nums, target);

  4. integerVectorToString(ret);
    1.getline(cin, line)
    getline作为gcc的扩展定义,它会生成一个包含一串从输入流读入的字符的字符串,直到以下情况发生会导致生成的此字符串结束。1)到文件结束,2)遇到函数的定界符,3)输入达到最大限度。
    应用范围:用于读取一行字符直到换行符,不读取换行符;
    其他用法可参考:C++中的getline()
    2. stringToIntegerVector(line)
    程序随之进入stringToIntegerVector(line) ;又遇到自己没见过的函数 input.erase();这里主要提一下erase();需要详细了解可参考–STL中erase()的用法
    简而言之:erase函数是用来操作string的,函数原型如下:
    (1)有两个参数,且参数类型都是size_t型:string& erase ( size_t pos = 0, size_t n = npos );功能是:删除容器中从pos位置开始的n个元素。返回值是经过删除操作后的容器。
    (2)有一个参数,且参数类型为iterator:iterator erase ( iterator position );功能是:删除容器中position所指位置的元素。返回值是指向被删元素之后的那个元素(即下一个元素)的迭代器。
    (3)有两个参数,且参数类型都是iterator:iterator erase ( iterator first, iterator last );功能是:删除容器中first到last之间的所有元素(左闭右开),但不包括last所指的元素。(即删除fist~last -1所指的元素)返回值是一个迭代器,该迭代器指向last所指得的元素,可以理解为返回的就是last。

    紧接着find_if()函数又挡在门前,感觉自己白学了那么多年,只会百度代码。C++ STL算法系列2;
    find_if :在序列中找符合某谓词的第一个元素。
    find_if算法 是find的一个谓词判断版本,它利用返回布尔值的谓词判断pred,检查迭代器区间[first, last)上的每一个元素,如果迭代器iter满足pred(*iter) == true,表示找到元素并返回迭代器值iter;未找到元素,则返回last。
    所以trimLeftTrailingSpaces(input);这个函数我理解为了保证读取的输入左侧不为空。
    继续往下走,有认识了一个函数String.substr( );其作用是抽去一个子串,但是它和String.substring( )有所不同用法如下:string.substr(start, length)
    start:指代截取子串开始下标
    length:截取子串的长度(可省略)
    详细用法参考了截取字符串substring与substr之间的区别
    接下来的代码就慢慢地能看懂了;为了取出输入的数字,分离出输入的“,”;而后将其转化为整型存放至动态数组,而后返回;这里还有一个函数stoi(item) ;其意思是解析str的文本转化为为int整数。函数模板为:

int stoi (const string& str, size_t* idx = 0, int base = 10);
int stoi (const wstring& str, size_t* idx = 0, int base = 10);

idx如果不为空,则会返回一个字符串中遇到的第一个字符(非数字)的字符下标,最后一个base是默认10进制。具体参考c++的atoi和stoi一些区别
此时已经将输入的第一行转化为动态数组存放至nums;接着读取第二行,和第一步相似;
3.Solution().twoSum(nums, target)
显然这里就是需要写我们自己的函数了;这里不做过多的解释;
4.integerVectorToString(ret)
由于返回的数组类型,这里先转化成string类型,再做输出操作;
这里的程序也比较熟悉,就不一一赘述了;就这样吧,菜菜的自我梳理。

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值