本博客记录作者使用C++语言进行刷题经常用到的API操作技巧,因为该博客是在持续更新维护中,可能存在笔记不清晰的情况,另外该博客只记录常用技巧,不常用的技巧方法不会考虑。

一、排序技巧

1、将一维数组vector进行排序

/*案例一:从小到大排序*/
vector<int> A={5, 6, 7,1,7,6,8}
sort(nums.begin(), nums.end());// 将A从小到大排序
/*案例二:反向*/
reverse(A.begin(), A.end());  //将A前后颠倒
/*案例三:按照绝对值进行从大到小的排序*/
static bool cmp(int a, int b) {
    return abs(a) > abs(b); //大于表示从大到小
}
sort(nums.begin(), nums.end(), cmp);

2、将二维数组vector进行排序

vector<vector<int>> A;//[[10,16],[2,8],[1,6],[7,12]]
// 用于排序比较的静态方法cmp,返回值必须是bool,必须是静态方法,数组最好加&,可以大幅提升效率
static bool cmp(const vector<int>& a,const vector<int>& b){
    if(a[0]==b[0]){
        return a[1]<b[1];
    }
    return a[0]<b[0];
}
sort(nums.begin(), nums.end(),cmp);// 将A按照cmp的方法排序

二、统计频率技巧

1、统计26个小写字母出现的频率

string s="abcabaosdfafbnaklfa"
/*方法一:使用整数数组*/
int feq[26]={0};//字母频率数组
for(int i=0;i<s.size();i++){
    feq[s[i]-'a']+=1;
}
/*方法二:使用unordered_map*/
unordered_map<char,int> feq;
for(int i=0;i<s.size();i++){
    M[s[i]]+=1;
}
// 遍历映射表
for(unordered_map<char,int>::iterator it=map.begin();it!=map.end();it++){
    // 如果频率不为零
    if(it->second!=0)
        return false;
}

三、分割序列技巧

1、分割vector

vector<int> nums = {0,1,2,3,4,5} ;
/*方法一:临时取子序列,使用下标即可*/
int left = 0;
int right = 2;
nums[left,right]
/*方法二:彻底分割子序列,新建*/ 
vector<int> leftNums(nums.begin(),nums.begin()+2);

2、分割string

string s="ababcbacadefegdehijhklij";
/*方法一:临时取子序列,使用下标即可*/
int left = 0;
int right = 2;
s[left,right]
/*方法二:彻底分割子序列,新建*/ 
strs.substr(0, 2);//从起始位置0开始,截取2个字符,返回一个string类型

四、类型转换技巧

1、int和string

int num = 123456; 
string strNum = to_string(n);  //将整数转换为string
int newNum = stoi(strNum); //将string转换为整数

//注意:数字字符可以直接进行比较:'8'<'9'

常见情景:

处理int的位数,可以先将int转换为string,就可以快速遍历整数

2、int和char

char c='8'
int num = c-'0'; //8
char c1 = num+'0';  //'8',不能转换10及其以上的数字

//注意:数字字符可以直接进行比较:'8'<'9'

常见情景:

处理int的位数,可以先将int转换为string,就可以快速遍历整数