#include
//前两个参数是累加的元素范围 第三个参数是累加和的初值
int sum = accumulate(vec.begin() , vec.end() , 42);
寻找数组的中心索引:
给你一个整数数组nums,请编写一个能够返回数组“中心下标”的方法。数组中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。如果数组不存在中心下标,返回-1。如果数组有多个中心下标,应该返回最靠近左边的那一个。
注意:中心下标可能出现在数组的两端。
实例:
题解:[0,i],[i+1,n-1]
class Solution {
public:
int pivotIndex(vector<int>& nums) {
//寻找数组的中心索引
//遍历数组
for(int i = 0;i<nums.size();i++){
//判断i是否为中心索引
if(accumulate(nums.begin(),nums.begin()+i,0) == accumulate(nums.begin()+i+1,nums.end(),0)){
return i;
}
}
//不存在
return -1;
}
};
如下是find() 函数的语法格式:
InputIterator find (InputIterator first, InputIterator last, const T& val);
其中,first 和 last 为输入迭代器,[first, last) 用于指定该函数的查找范围;val 为要查找的目标元素。
该函数会返回一个输入迭代器,当 find() 函数查找成功时,其指向的是在 [first, last) 区域内查找到的第一个目标元素;如果查找失败,则该迭代器的指向和 last 相同。
即判断元素是否存在:
//target为目标值
vector<int>::iterator result = find(vec.begin(), vec.end(), target);
if(result == vec.end()){
//不存在
}else{
//存在
}
distance()函数用于计算两个迭代器表示的范围内包含元素的个数,其语法格式如下:
template<class InputIterator>
typename iterator_traits<InputIterator>::difference_type distance (InputIterator first, InputIterator last);
其中,first 和 last 都为迭代器,其类型可以是输入迭代器、前向迭代器、双向迭代器以及随机访问迭代器;该函数会返回[first, last)范围内包含的元素的个数。
由此可以用该函数返回目标元素的索引值:使用前需要加上头文件,以及命名空间
#include
using namespace std;
获得索引值用法如下:
//接上述代码
int index = distance(vec.begin(), result);
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
//寻找目标值 返回索引 否则返回其对应位置索引
int n = nums.size();
//查找target
vector<int>::iterator result = find(nums.begin(), nums.end(), target);
//不存在时
if(result == nums.end()){
//遍历以插入
for(int i = 0;i<n;i++){
//小于等于 插入
if(target<=nums[i]){
return i;
}
//大于 什么也不做
}
//出了循环 说明target值比所有元素都大
return n;
}else{
//存在
int index = distance(nums.begin(), result);
return index;
}
}
};
vector<string> split(const string &str, const string &pattern){
vector<string> res;
if(str == "")
return res;
//在字符串末尾也加入分隔符,方便截取最后一段
string strs = str + pattern;
size_t pos = strs.find(pattern);
while(pos != strs.npos)
{
string temp = strs.substr(0, pos);
res.push_back(temp);
//去掉已分割的字符串,在剩下的字符串中进行分割
strs = strs.substr(pos+1, strs.size());
pos = strs.find(pattern);
}
return res;
}
#include
string str = "hello";
//改函数仅对string对象有用
reverse(str.begin(),str.end());
反转字符串中的单词:给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
class Solution {
public:
string reverseWords(string s) {
//首先将每个单词分割开
vector<string> strs;
//使用一个变量记录每一个单词的开头下标
int index = 0;
for(int i = 0;i<s.length();i++){
if(s[i] == ' '){
//如果是空格
//substr第二个参数是长度 i-index
strs.push_back(s.substr(index,i-index));
//由于字符串中不会有多余的空格 因而index的位置可以直接确定
index = i+1;
i++;
}
//最后一个单词
if(i == s.length()-1){
strs.push_back(s.substr(index,i-index+1));
}
}
//将strs中的字符串反转 并且拼接到字符串中
string result;
for(int i = 0;i<strs.size();i++){
reverse(strs[i].begin(),strs[i].end());
result += strs[i];
if(i != strs.size()-1){
result += " ";
}
}
return result;
}
};
partition函数:
#include
template< class ForwardIt, class UnaryPredicate >
ForwardIt partition( ForwardIt first, ForwardIt last, UnaryPredicate pred );
对[first,last]元素进行处理,使得满足条件pred(筛选规则)的元素移到前边,不满足的移到后面,该函数可能会改变各组原始元素的相对位置。该函数会返回一个正向迭代器,其指向的是两部分数据的分界位置,更确切地说:指向的是第二组数据中的第一个元素。
stable_partition()函数:
#include
BidirectionalIterator stable_partition (BidirectionalIterator first,
BidirectionalIterator last,
UnaryPredicate pred);
该函数作用同partition函数作用一样,不同的是该函数并不会改变各组元素的相对位置。同样有返回值,指向第二组数据中的第一个元素。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
//移动零 使用stl中的分组函数 且不改变元素的相对位置
stable_partition(nums.begin(),nums.end(),[](int a){
//不为零的将被移动到前面
return a!=0;
});
}
};
//排序所需函数
static bool CmpByValue(const pair<int,int>& lhs, const pair<int,int>& rhs) {
//降序
return lhs.second > rhs.second;
}
//排序时用法 转换为pair 排序后是一个pair数组
vector<pair<int,int>> sortValue(hashmap.begin(),hashmap.end());
sort(sortValue.begin(),sortValue.end(),CmpByValue);
前k个高频元素
#include
char c = '2';
if(isdigit(c)!=0){
//是数字
}
if(isalpha(c)!=0){
//是字母
}