一,子数组之和
描述
给定一个整数数组,找到和为 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);
}