长期更新收藏的函数——那些年我们跪在键盘上欣赏过的函数

//求最大公因数
int gcd(int a, int b) 
{
	return b == 0 ? a : gcd(b, a % b);
}
//判断奇偶数
bool is_odd(int num)  //是奇数吗
{
	return num & 1;
}
/*字母大小写转换的方法:
统一转成大写:ch & 0b11011111 简写:ch & 0xDF
统一转成小写:ch | 0b00100000 简写:ch | 0x20
比较的时候注意加上小括号哦,因为位运算优先级比较低。*/
if((s.charAt(i ++) & 0xDF) != (s.charAt(j --) & 0xDF)) return false; 

//另一种方法:tolower(),toupper()两个库函数(在cctype头文件中)
//原型如下:
int tolower(int c)    //将大写字母转换为小写字母,非大写字母不做处理
{
	if ((c >= 'A') && (c <= 'Z'))
		return c + ('a' - 'A');
	return c;
}
 
int toupper(int c)    //将小写字母转换为大写字母
{
	if ((c >= 'a') && (c <= 'z'))
		return c + ('A' - 'a');
	return c;
}

//判断字符是否为“数字或者字母”
isalnum()
函数声明:int isalnum(int c);
若符合,则返回非零值,不符合则返回0
//sort函数 参考https://blog.csdn.net/Architect_chaser/article/details/88322605

//升序
int a[11]={0,1,2,13,45,2,33,1,6,78,4};
sort(a,a+11);

//降序
bool cmp(int a,int b)
{
    return a>b;
}
int a[11]={0,1,2,13,45,2,33,1,6,78,4};
sort(a, a+11, cmp);
sort(a, a+11, [](const int& a, int& b){return a>b});   //这是利用lamda表达式的写法,更方便!!!

//string类排序(根据长度)
bool cmp(string a,string b)
{
    return a.size() < b.size();
}

string a[4]={"hhhhh","heheheh","xxxxxx","kkkkkk"};
sort(a,a+4,cmp);
//sort( words.begin(), words.end(), [](string &a, string &b){  return a.size() < b.size(); } );

在这里插入图片描述

//对一些排序、比较大小的算法进行自定义比较准则的原理
bool cmp(const string& s1, const string& s2){
	return s1.length()<s2.length();
}
int main(){
	string s1 = "zoo";
	string s2 = "adidas";
	cout << max(s1, s2) << endl;      //输出"zoo"      默认按照字母排序比较,比如'z' 要大于 'a‘
	cout << max(s1, s2, cmp);         //输出"adidas"   自定义了cmp比较函数,比较长度,"adidas“比”zoo“长
	return 0;
}
//map中根据key进行排序、map中根据value进行排序
//假如 map 结构是 <string, int>

//①默认按照string字典序
map<string, int> name_score_map;

//②按照string字典倒序
map<string, int, greater<string> > name_score_map;

//③根据string长度排序
struct CmpByKeyLength {
  bool operator()(const string& k1, const string& k2) {
    return k1.length() < k2.length();
  }
};

int main() {
  map<string, int, CmpByKeyLength> name_score_map;
  name_score_map["LiMin"] = 90; 
  ......
  return 0;
}

//④根据 map 的 value排序, 先把map中的元素pair放进vector,然后利用sort排序
map<string, int> name_score_map;
name_score_map["LiMin"] = 90;
......
vector<pair<string, int>> vec(name_score_map.begin(), name_score_map.end());
sort(vec.begin(), vec.end(), [](const pair<int, int>& a, const pair<int, int>& b){return a.second < b.second;});  //利用lamda函数的写法
//①优先队列实现的大顶堆
priority_queue<pair<int, int>, vector<pair<int, int>>, less<pair<int, int>> > q;
priority_queue< pair<int,int> > q;   //大顶堆可以用缺省写法

//②优先队列实现的小顶堆
priority_queue< pair<int, int>, vector<pair<int, int>>, greater<pair<int, int> > q;  

//③优先序列的自定义比较器
class cmp{
    public:
        bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {
            return lhs.second > rhs.second;
        }
};
int main(){
priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> q;
}
解决“约瑟夫环”问题 题目地址:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/
解决思路:https://blog.csdn.net/u011500062/article/details/72855826

int pos = 0; // 最终活下来那个人的初始位置,n为 数组长度,m为 每隔m个毙掉一个数
for(int i = 2; i <= n; i++){
    pos = (pos + m) % i;  // 每次循环右移
    }
return pos;
//实现固定个元素所有不同排列  家为办法
void permutation(vector<int>& nums,int start,vector<vector<int>>& ans)
    {
        if(start==nums.size()-1)
        {
            ans.push_back(nums);
        }
        else
        {
            for(int i=start;i<nums.size();i++)
            {
                swap(nums[i],nums[start]);
                permutation(nums,start+1,ans);
                swap(nums[i],nums[start]);
            }
        }
    }

//一行代码判断两棵“树”是否完全相同
bool isSameTree(TreeNode* p, TreeNode* q) {
	return (p == q) || ( p != null && q != null && p->val == q->val && isSameTree(p->left, q->left) && isSameTree(p->right, q->right) );
	//(p == q)判断当p、q都为NULL时
    }
//将数值转换为string类
int a = 4;
string s = to_string(a);  //to_string的运用
//将vector逆序
vevtor<int> vec;
//对vec读入{1,2,3,4,5,6}
reverse(vec.begin(),vec.end());
//逆序后变为{6,5,4,3,2,1}
//利用数组对进行vector初始化
int a[6] = {0,1,2,3,4,5};
vector<int> vec(a,a+6);
//二分查找函数lower_bound、upper_bound
lower_bound(first, last, val)
//函数lower_bound()二分查找非递减序列[first,last) 内第一个“大于或等于”某个元素的位置,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置.
upper_bound(first, last, val)
//函数upper_bound()二分查找非递减序列[first,last) 内第一个“大于”某个元素的位置

//例子,详情请查看:https://blog.csdn.net/vocaloid01/article/details/80583539?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-3
int board[5] = {1,2,3,4,5};
int main(){
	sort(board,board+5);
	int t1 = lower_bound(board,board+5,3)-board;
	int t2 = upper_bound(board,board+5,3)-board;
	cout<<t1<<' '<<t2<<endl;       //t1=2, t2=3
	return 0;
} 
//vector统一赋值
vector<int> vec(16);   //有明确长度的vector
fill(freq.begin(), freq.end(), 4);   //将vec的所有元素置为“4”
template< class BidirIt, class UnaryPredicate > BidirIt stable_partition( BidirIt first, BidirIt last, UnaryPredicate p );
第三个参数P可传入一个仿函数,函数指针,Lambda表达式,这里所示代码为Lambda表达式。
函数的意思是:对传入的区间[first, last)中的每个值进行P(value)判断,如果为真,就放入左边,并且保持稳定。

例子:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
vector<int> array
stable_partition(array.begin(), array.end(), [](int x) {return x&1;} );

//去除字符串头尾连续空格
string s = "    8s9ajdfd9s    ";
s = s.trim();     //s="8s9ajd9s"
//string 转 int 
stoi()
//int 转 string
to_string()
//自带计算总和函数
vector<int> vec;
...
int sum = accumulate(vec.begin(), vec.end(), 0); 
//0表示累加的初始值
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值