138 · 子数组之和,字符串分割

 一,子数组之和

描述

给定一个整数数组,找到和为 00 的子数组。你的代码应该返回满足要求的子数组的起始位置和结束位置

样例

样例 1:

 
输入: [-3, 1, 2, -3, 4]
输出: [0,2] 或 [1,3]	
样例解释: 返回任意一段和为0的区间即可。

样例 2:

 
输入: [-3, 1, -4, 2, -3, 4]
输出: [1,5]

class Solution {

public:

    /**

     * @param nums: A list of integers

     * @return: A list of integers includes the index of the first number and the index of the last number

     */

    vector<int> subarraySum(vector<int> &nums) {

        // write your code here

    }

};、

相关知识点:

1,vector<int> subarraySum(vector<int> &nums)函数:

subarraySum 函数的名字意味着它计算了给定数组(nums)中所有连续子数组的和。

具体来说,这个函数返回一个向量(vector<int>),向量中的每个元素是原数组中连续子数组的和。例如,如果原数组是 [1, 2, 3, 4, 5],那么返回的向量将是 [1, 3, 6, 10, 15],因为 1+2=3,3+4=7,7+5=12。

请注意,这个函数需要一个 vector<int> 的引用(vector<int> &nums),这意味着它会直接修改传入的原始数组。

2,result.pushback()函数

这个函数的作用是在向量的末尾添加一个元素。

你的代码result.push_back(i)意味着将变量i的值添加到result这个向量的末尾。result应该是一个已经初始化的std::vector<int>。

如果你要向result向量中添加一系列的元素,你可以使用一个for循环。例如:


std::vector<int> result;
for(int i = 0; i < 10; i++) {
    result.push_back(i);
}


这段代码将向result向量中添加数字0到9。

class Solution {
2public:
3    /**
4     * @param nums: A list of integers
5     * @return: A list of integers includes the index of the first number and the index of the last number
6     */
7    vector<int> subarraySum(vector<int> &nums) {
8        // write your code here
9
10		// 返回任意一段和为0的区间即可
11		vector<int> result;
12		int ans=0;
13		if((nums.size()==1)&&(nums[0]==0))
14		{
15			result.push_back(nums[0]);
16			return result;
17		}
18
19		for(int i=0;i<nums.size()-1;++i)
20		{
21			ans=nums[i];
22			// 单独判断一下nums[i]==0?
23			if(ans==0)
24			{
25				result.push_back(i);
26				result.push_back(i);
27				break;
28			}
29
30			for(int j=i+1;j<nums.size();++j)
31			{
32				ans+=nums[j];
33				if(ans==0)
34				{
35					result.push_back(i);
36					result.push_back(j);
37					break;
38				}
39			}
40			//如果ans==0了就直接退出循环了;
41			if(ans==0)
42			{
43				break;
44			}
45		}
46		return result;
47    }
48}

二,字符串分割

相关函数小结:

1,strcmp函数

strcmp是一个C语言标准库函数,用于比较两个字符串。该函数的原型通常如下:
int strcmp(const char *s1, const char *s2);


这个函数会按字典顺序比较两个字符串s1和s2。如果s1和s2是完全相同的,那么返回值为0。如果s1字典序小于s2,返回一个负值。如果s1字典序大于s2,则返回一个正值

例如:
#include <stdio.h>
#include <string.h>
int main() {
    char str1[] = "Hello";
    char str2[] = "World";
    int result = strcmp(str1, str2);
    printf("The result is: %d\n", result);
    return 0;
}


在这个例子中,输出将是负数,因为"Hello"在字典顺序上小于"World"。

2,substr(a,b)函数

您提到的s.substr(start,end-start)是一个字符串切片(substring slicing)的操作,常见于许多编程语言中。这个操作从字符串s中提取一个子字符串,起始位置为start,并且长度为end - start。

让我们详细解释一下这个操作:

start:这是子字符串开始的位置。第一个字符的位置是0,所以如果start是0,那么子字符串将从字符串的开始位置开始。如果start大于0,那么子字符串将从字符串的中间或末尾开始。
end:这是子字符串结束的位置。这意味着子字符串将包含从start开始,到end之前(不包括end)的字符。

例如,如果我们有一个字符串s = "Hello, world!",并且我们执行s.substr(7, 5),那么将返回子字符串"world!",因为子字符串从第7个字符开始(索引从0开始),并且长度为5。

3,move()函数

在C++中,std::move函数用于将一个对象转移到另一个对象,这个操作是不可逆的。这个函数常常用于优化性能,特别是在涉及到如std::vector等需要移动大量元素的容器时

在你给出的代码return move(res);中,它试图将res对象转移到返回值中。这是一种有效的优化方法,特别是当res对象在函数中创建,而函数返回值需要复制res对象时。通过使用std::move,可以避免不必要的复制操作,从而提高性能。

但是,需要注意的是,一旦一个对象被std::move了,那么它就处于一种“损坏”状态,不能被再次使用。所以在实际编程中,你需要确保这个对象在std::move之后不会被再次使用。

此外,std::move并不总是提高性能。在某些情况下,比如对象很小,或者复制操作的成本不高时,std::move可能并不会带来明显的性能提升。因此,你应该根据具体的情况来决定是否使用std::move。

4,s.find(t, start)函数:

在C++中,std::string::find函数用于在一个字符串中查找子字符串的首次出现。函数的定义如下:


size_type find(const std::string& str, size_type pos = 0) const;


其中,pos是可选参数,默认为0,表示从字符串的开始位置开始查找。函数返回的是子字符串在源字符串中首次出现的位置,如果没找到则返回std::string::npos

因此,pos = s.find(t, start);这行代码的作用是在字符串s中从start位置开始查找子字符串t,并返回找到的第一个位置,然后将这个位置赋值给pos。如果没找到,那么pos就会被设置为std::string::npos。

5,emplace_back()函数

res.emplace_back(s.substr(start))和 res.emplace_back(s.substr(start, pos - start));

res.emplace_back(s.substr(start)):

emplace_back是一个非静态成员函数,用于在向量的末尾就地构造一个元素。它接受一个参数,这个参数是用来构造新元素的值。

在该代码中,它使用s.substr(start)来生成这个值。substr函数从字符串s的start位置开始提取一个子字符串

res.emplace_back(s.substr(start, pos - start)):

substr函数接受两个参数:start和pos - start。start参数指定子字符串的起始位置,而pos - start参数指定子字符串的长度。

这行代码的意思是:从字符串s的start位置开始,提取一个长度为pos - start的子字符串,并将其添加到向量res的末尾

例如,如果s是"Hello, world!",start是7,pos是12,那么提取的子字符串就是"world",并将其添加到向量res的末尾。

6,push_back()函数:

你提到了push_back()函数,我猜你可能是在谈论C++中的std::vector类的push_back()函数。

push_back()是C++中的一个标准库函数,用于在容器的末尾添加一个元素。这个函数在std::vector, std::list, std::deque等序列容器中都可以使用。

函数的基本格式是:void push_back (const value_type& val);

其中,val是要添加到容器末尾的元素。

例如,如果你有一个std::vector<int>类型的向量,并且想要将10添加到向量的末尾,你可以这样写:

执行这段代码后,向量v将包含一个元素,即10。

代码实现:

/**
 * @param s: A string
 * @param t: A string
 * @return: A vector of sub strings
 */
vector<string> splitString(string &s, string &t) {
    // write your code here
       vector<string> res;
    int start=0,pos;
    while(start<s.size())
    {
        pos=s.find(t,start);//标记分割位置,从开始位置检索,检索到分隔符,记录位置(下标)
        if(pos==string::npos){//发现没有分割标志,直接原串输出
        res.emplace_back(s.substr(start));
        break;}
        res.emplace_back(s.substr(start,pos-start));//向res录入第一段字符串
        start=pos+t.size();//跳过当前分割字符串,将分割字符串后的位置作为新的开始点
    }
    return move(res);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值