【LeetCode】Explore:Array & String 数组 & 字符串

参考自LeetCode上Explore模块的Array & String,作为笔记记录。

Overview 综述

字符串是字符数组,主要了解数组和动态数组之间的区别以及基本操作。理解多维数组的使用,以及双指针技巧的使用。

主要内容:

  1. 了解数组动态数组之间的区别;
  2. 熟悉数组和动态数组中的基本操作
  3. 理解多维数组并能够掌握二维数组的使用;
  4. 明白字符串的概念以及字符串所具有的不同特性;
  5. 能够运用双指针技巧解决实际问题。

Introduction to Array 数组简介

主要了解数组和动态数组。

数组简介

数组用于按顺序存储元素的集合。图示是一位数组的例子。数组中的元素可以随机存取,通过数组索引来识别。

数组的用法示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>

int main() {
// 1. Initialize
int a0[5];
int a1[5] = {1, 2, 3}; // other element will be set as the default value
// 2. Get Length
int size = sizeof(a1) / sizeof(*a1);
cout << "The size of a1 is: " << size << endl;
// 3. Access Element
cout << "The first element is: " << a1[0] << endl;
// 4. Iterate all Elements
cout << "[Version 1] The contents of a1 are:";
for (int i = 0; i < size; ++i) {
cout << " " << a1[i];
}
cout << endl;
cout << "[Version 2] The contents of a1 are:";
for (int& item: a1) {
cout << " " << item;
}
cout << endl;
// 5. Modify Element
a1[0] = 4;
// 6. Sort
sort(a1, a1 + size);
}

动态数组简介

多数编程语言提供内置的动态数组,例如C++中的vector,Java中的ArrayList。

动态数组用法示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>

int main() {
// 1. initialize
vector<int> v0;
vector<int> v1(5, 0);
// 2. make a copy
vector<int> v2(v1.begin(), v1.end());
vector<int> v3(v2);
// 2. cast an array to a vector
int a[5] = {0, 1, 2, 3, 4};
vector<int> v4(a, *(&a + 1));
// 3. get length
cout << "The size of v4 is: " << v4.size() << endl;
// 4. access element
cout << "The first element in v4 is: " << v4[0] << endl;
// 5. iterate the vector
cout << "[Version 1] The contents of v4 are:";
for (int i = 0; i < v4.size(); ++i) {
cout << " " << v4[i];
}
cout << endl;
cout << "[Version 2] The contents of v4 are:";
for (int& item : v4) {
cout << " " << item;
}
cout << endl;
cout << "[Version 3] The contents of v4 are:";
for (auto item = v4.begin(); item != v4.end(); ++item) {
cout << " " << *item;
}
cout << endl;
// 6. modify element
v4[0] = 5;
// 7. sort
sort(v4.begin(), v4.end());
// 8. add new element at the end of the vector
v4.push_back(-1);
// 9. delete the last element
v4.pop_back();
}

练习:寻找数组的中心索引

给定一个整数类型的数组 nums,请编写一个能够返回数组“中心索引”的方法。

我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。

如果数组不存在中心索引,那么我们应该返回 -1。如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个。

示例 1:

1
2
3
4
5
6
输入: 
nums = [1, 7, 3, 6, 5, 6]
输出: 3
解释:
索引3 (nums[3] = 6) 的左侧数之和(1 + 7 + 3 = 11),与右侧数之和(5 + 6 = 11)相等。
同时, 3 也是第一个符合要求的中心索引。

示例 2:

1
2
3
4
5
输入: 
nums = [1, 2, 3]
输出: -1
解释:
数组中不存在满足此条件的中心索引。

说明:

  • nums 的长度范围为 [0, 10000]
  • 任何一个 nums[i] 将会是一个范围在 [-1000, 1000]的整数。

解题思路

首先计算数组元素总和,之后顺序遍历数组,如果当前位置左侧的和,乘以2加上当前位置的值等于数组总和,则当前位置为中心索引。

需要注意的是边界值的判断。

用到的测试用例:

1
2
3
4
5
6
7
8
9
[1]
[-1,-1,-1,0,1,1]
[1,7,3,6,5,6]
[1,2,3]
[1,2]
[]
[1,2,3,4,6]
[1,2,3,6]
[1,1,1]

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
int pivotIndex(vector<int>& nums) {
if (nums.size() == 0 || nums.size() == 2)
return -1;
if (nums.size() == 1)
return 0;
int sum = 0;
for (int i: nums) {
sum += i;
}

int temp = 0;
for (int i=0; i<nums.size(); i++) {
if (temp * 2 + nums[i] == sum) {
return i;
}
temp += nums[i];
}
return -1;
}
};

其中,C++中对vector元素求和,可使用accumulate函数,头文件#include <numeric>如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
int pivotIndex(vector<int>& nums) {
if (nums.size() == 0 || nums.size() == 2)
return -1;
if (nums.size() == 1)
return 0;
// int sum = 0;
// for (int i: nums) {
// sum += i;
// }
int sum = accumulate(nums.begin(), nums.end(), 0);

int temp = 0;
for (int i=0; i<nums.size(); i++) {
if (temp * 2 + nums[i] == sum) {
return i;
}
temp += nums[i];
}
return -1;
}
};
-------------本文结束感谢您的阅读-------------
0%