数据结构丨数组和字符串
2019-06-06 12:48
1266 查看
数组简介
数组简介
数组是一种基本的数据结构,用于按顺序
存储元素的集合。但是元素可以随机存取,因为数组中的每个元素都可以通过数组
索引来识别。
数组可以有一个或多个维度。这里我们从
一维数组开始,它也被称为线性数组。这里有一个例子:
在上面的例子中,数组 A 中有 6 个元素。也就是说,A 的长度是 6 。我们可以使用 A[0] 来表示数组中的第一个元素。因此,A[0] = 6 。类似地,A[1] = 3,A[2] = 8,依此类推。
数组中的操作
让我们来看看数组的用法:
#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。
动态数组中的操作
让我们来看看动态数组的用法:
#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:
输入: nums = [1, 7, 3, 6, 5, 6] 输出: 3 解释: 索引3 (nums[3] = 6) 的左侧数之和(1 + 7 + 3 = 11),与右侧数之和(5 + 6 = 11)相等。 同时, 3 也是第一个符合要求的中心索引。
示例 2:
输入: nums = [1, 2, 3] 输出: -1 解释: 数组中不存在满足此条件的中心索引。
说明:
nums
的长度范围为[0, 10000]
。- 任何一个
nums[i]
将会是一个范围在[-1000, 1000]
的整数。
class Solution{ public: int pivotIndex(vector<int>& nums){ if(nums.size() == 0) return -1; int sum = accumulate(nums.begin(), nums.end(), 0); int leftSum = 0; for(int i=0; i<nums.size(); i++) if(leftSum == sum-leftSum-nums[i]) return i; else leftSum += nums[i]; return -1; } };
至少是其他数字两倍的最大数
在一个给定的数组
nums中,总是存在一个最大元素 。
查找数组中的最大元素是否至少是数组中每个其他数字的两倍。
如果是,则返回最大元素的索引,否则返回-1。
示例 1:
输入: nums = [3, 6, 1, 0] 输出: 1 解释: 6是最大的整数, 对于数组中的其他整数, 6大于数组中其他元素的两倍。6的索引是1, 所以我们返回1.
示例 2:
输入: nums = [1, 2, 3, 4] 输出: -1 解释: 4没有超过3的两倍大, 所以我们返回 -1.
提示:
nums
的长度范围在[1, 50]
.- 每个
nums[i]
的整数范围在[0, 99]
.
#include <iostream> #include <vector> using namespace std; /// Linear Scan /// Time Complexity: O(n) /// Space Complexity: O(1) class Solution{ public: int dominantIndex(vector<int>& nums){ int maxNum = *max_element(nums.begin(), nums.end()); int res = -1; for(int i = 0; i< nums.size(); i++) if(nums[i] != maxNum){ if(maxNum < 2*nums[i]) return -1; } else res = i; return res; } };
加一
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3] 输出: [1,2,4] 解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1] 输出: [4,3,2,2] 解释: 输入数组表示数字 4321。
#include <iostream> #include <vector> using namespace std; /// Ad Hoc /// Time Complexity: O(n) /// Space Complexity: O(1) class Solution{ public: vector<int> plusOne(vector<int>& digits){ digits[digits.size() -1] ++; for(int i=digits.size()-1; i>=1; i--) if(digits[i] == 10){ digits[i] = 0; digits[i-1] ++; } if(digits[0] == 10){ digits[0] = 0; digits.insert(digits.begin(), 1); } return digits; } }
二维数组简介
字符串简介
双指针技巧
小结
相关文章推荐
- 第四章字符串和多维数组
- 用TreeSet对指定字符串数组内容进行排序(1)
- 前台js数组转json字符串,后台json字符串转为json数组,最后转换成集合的具体实现
- 指针、引用、数组和字符串,你真的全弄清楚了吗?
- JAVA字符串如何像数组一样取字符?
- 字符串的数组形式与指针形式
- 数组和字符串//长度最小的子数组
- 用C#编程语言实现数据结构传递整型变量、字符串和数组的方法
- C# 16进制与字符串、字节数组之间的转换
- Java String[] 字符串数组去重,排序,toString
- 第七章 数组与字符串
- 用qsort对字符串数组排序需要注意的几个问题
- java中字符串转换为字符串数组
- 数组的索引--原来是字符串类型吗
- 密码学2——Java byte数组与十六进制字符串互转
- 字符数组和字符串的区别
- C++ BYTE数组转字符串
- 实验十(二)-1、输入一个字符串和一个正整数x,将该字符串中的后x个字符复制到另一个字符串y中,输出字符串y;再对y串的内容前后倒置后存入数组z中并输出。
- js数组与字符串的相互转换方法
- C语言中字符数组和字符串指针分析