数位dp 笔记

news2024/11/15 10:42:31

小技巧1:求区间[X, Y]可以转换为求F(Y) - F(X-1)

                        F(X)表示0~X中满足条件的数字个数

小技巧2:可以用树的形式来看

 遍历最高位,每一位分为两种情况:未达到上界和达到上界

如果走到右边最底端需加1

度的数量

求给定区间 [X,Y]中满足下列条件的整数个数:这个数恰好等于 K 个互不相等的 B 的整数次幂之和。

例如,设 X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足题意:

17=2^4+2^0
18=2^4+2^1
20=2^4+2^2

输入格式

第一行包含两个整数 X 和 Y,接下来两行包含整数 K 和 B。

输出格式

只包含一个整数,表示满足条件的数的个数。

数据范围

1≤X≤Y≤2^31−1,
1≤K≤20,
2≤B≤10

输入样例:
15 20
2
2
输出样例:
3

 B进制上放K个1,在[X, Y]范围内的数量

左节点可放0或1

右节点只能放0或1,大于1时break

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
 
using namespace std;
 
typedef pair<int, int> PII;
typedef long long ll;

const int N = 35;

int l, r, K, B;
int f[N][N];

void init()
{
	f[0][0] = 1;
	for(int i = 1; i < N; i ++)
	{
		for(int j = 0; j <= i; j ++)
		{
			if(!j)f[i][j] = 1;
			else f[i][j] = f[i - 1][j] + f[i - 1][j - 1];
		}
	}
}

int C(int a, int b)
{
	if(a < b || b < 0)return 0;
	return f[a][b];
}

int dp(int n)
{
	if(!n)return 0;
	
	vector<int> nums;
	while(n)
	{
		nums.push_back(n % B);
		n /= B;
	}
	
	int res = 0, last = 0;
	for(int i = nums.size() - 1; i >= 0; i --)
	{
		int x = nums[i];
		
		if(x)//x>0才能走左分支 
		{
			res += C(i, K - last);
			if(x > 1)
			{
				res += C(i, K - last - 1);
				break;
			}
			else
			{
				last ++;
				if(last > K)break; //等于K时不能break,因为下一个还可以算左分支,或者如果一直放0也会走到右分支底端
			}
		}
		
		//只有走到底端(没有break出去)才能加1,不能放到循环外
		if(!i && last == K)res ++;//走到最后一步可能是1也可能是0 
	}
	return res;
}

int main()
{
	IOS
	init();
	cin >> l >> r >> K >> B;
	cout << dp(r) - dp(l - 1);
	
	return 0;
}

数字游戏

科协里最近很流行数字游戏。

某人命名了一种不降数,这种数字必须满足从左到右各位数字呈非下降关系,如 123,446。

现在大家决定玩一个游戏,指定一个整数闭区间 [a,b],问这个区间内有多少个不降数。

注意:不降数不能包含前导零。

输入格式

输入包含多组测试数据。

每组数据占一行,包含两个整数 a 和 b。

输出格式

每行给出一组测试数据的答案,即 [a,b] 之间有多少不降数。

数据范围

1≤a≤b≤2^31−1

输入样例:
1 9
1 19
输出样例:
9
18

 思路还是和模板差不多,关键点是找固定x时如何找不下降数的个数

可以用动态规划来找:

f[i][j]表示区间长度为i,第一个数字为j的不下降数个数

f[i][j] = \sum_{k=j}^{9} f[i-1][k]

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
 
using namespace std;
 
typedef pair<int, int> PII;
typedef long long ll;

const int N = 15;

int f[N][N];

void init()
{
	for(int i = 0; i <= 9; i ++)f[1][i] = 1;
	
	for(int i = 2; i < N; i ++)
	{
		for(int j = 0; j <= 9; j ++)
		{
			for(int k = j; k <= 9; k ++)
			{
				f[i][j] += f[i - 1][k];
			}
		}
	}
}

int dp(int n)
{
	if(!n)return 1;
	
	vector<int> nums;
	while(n)
	{
		nums.push_back(n % 10);
		n /= 10;
	}
	
	int res = 0, last = 0;
	for(int i = nums.size() - 1; i >= 0; i --)
	{
		int x = nums[i];
		
		for(int j = last; j < x; j ++)
		{
			res += f[i + 1][j];//关键点是这一步
		}
		
		if(x < last)break;
		last = x;
		if(!i)res ++;
	}
	return res;
} 

int main()
{
	IOS
	init();
	int l, r;
	while(cin >> l >> r)
	{
		cout << dp(r) - dp(l - 1) << endl;
	}
	
	return 0;
}

Windy数

Windy 定义了一种 Windy 数:不含前导零且相邻两个数字之差至少为 2 的正整数被称为 Windy 数。

Windy 想知道,在 A 和 B 之间,包括 A 和 B,总共有多少个 Windy 数?

输入格式

共一行,包含两个整数 A 和 B。

输出格式

输出一个整数,表示答案。

数据范围

1≤A≤B≤2×1e9

输入样例1:
1 10
输出样例1:
9
输入样例2:
25 50
输出样例2:
20

 和上一题差不多

额外知识点为如何处理前导零,两点:

1.最高的那一位从1开始而不是从0开始

2.再枚举位数  1~总位数-1   加上f[i][1~9]

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
 
using namespace std;
 
typedef pair<int, int> PII;
typedef long long ll;

const int N = 15;

ll f[N][10];

void init()
{
	for(int i = 0; i <= 9; i ++)f[1][i] = 1;
	
	for(int i = 2; i < N; i ++)
	{
		for(int j = 0; j <= 9; j ++)
		{
			for(int k = 0; k <= 9; k ++)
			{
				if(abs(j - k) >= 2)
				{
					f[i][j] += f[i - 1][k];
				}
			}
		}
	}
}

int dp(int n)
{
	if(!n)return 0;
	
	vector<int> nums;
	while(n)
	{
		nums.push_back(n % 10);
		n /= 10;
	}
	
	int res = 0, last = -9;
	for(int i = nums.size() - 1; i >= 0; i --)
	{
		int x = nums[i];
		for(int j = (i == nums.size() - 1); j < x; j ++)
		{
			if(abs(j - last) < 2)continue;
			res += f[i + 1][j];
		}
		if(abs(x - last) < 2)break;
		last = x;
		if(!i)res ++;
	}
	
	// 特殊处理有前导零的数
    //0也被当成前导零了,所以0是否算入需人为规定,如果算入则return 1 和res = 1,不算入就return 0和res = 0
	for(int i = nums.size() - 1; i >= 1; i --)
	{
		for(int j = 1; j <= 9; j ++)
		{
			res += f[i][j];
		}
	}
	return res;
}

int main()
{
	IOS
	init();
	int x, y;
	cin >> x >> y;
	cout << dp(y) - dp(x - 1); 
	
	return 0;
}

数字游戏 II

由于科协里最近真的很流行数字游戏。

某人又命名了一种取模数,这种数字必须满足各位数字之和 mod N 为 0。

现在大家又要玩游戏了,指定一个整数闭区间 [a.b],问这个区间内有多少个取模数。

输入格式

输入包含多组测试数据,每组数据占一行。

每组数据包含三个整数 a,b,N。

输出格式

对于每个测试数据输出一行结果,表示区间内各位数字和 mod N 为 0 的数的个数。

数据范围

1≤a,b≤2^31−1,
1≤N<100

输入样例:
1 19 9
输出样例:
2

 f[i][j][k]表示i位,首位为j,模数为k

其他一样,这题不处理前导零也没影响,但以防万一处理一下也没毛病(不处理时n=0时返回1)

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
 
using namespace std;
 
typedef pair<int, int> PII;
typedef long long ll;

const int N = 15;

ll f[N][10][110];//i位 首位为j 模数为k 
int mod;

void init()
{
	for(int i = 0; i <= 9; i ++)f[1][i][i % mod] ++;
	
	for(int i = 2; i < N; i ++)
	{
		for(int j = 0; j <= 9; j ++)
		{
			for(int k = 0; k < mod; k ++)
			{
				for(int u = 0; u <= 9; u ++)
				{
					f[i][j][(j + k) % mod] += f[i - 1][u][k];
				}
			}
		}
	}
}

int dp(int n)
{
	if(!n)return 1;
	
	vector<int> nums;
	while(n)
	{
		nums.push_back(n % 10);
		n /= 10;
	}
	
	int res = 0, last = 0;
	for(int i = nums.size() - 1; i >= 0; i --)
	{
		int x = nums[i];
		for(int j = 0; j < x; j ++)
		{
			res += f[i + 1][j][(mod - last) % mod];
		}
		
		last = (last + x) % mod;
		if(!i && !last)res ++;
	}

	return res;
}

int main()
{
	IOS
	int x, y;
	while(cin >> x >> y >> mod)
	{
	    memset(f, 0, sizeof f);
	    init();
    	cout << dp(y) - dp(x - 1) << endl; 
	}
	
	
	return 0;
}

不要62

杭州人称那些傻乎乎粘嗒嗒的人为 62(音:laoer)。

杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。

不吉利的数字为所有含有 4 或 62 的号码。例如:62315,73418,88914 都属于不吉利号码。但是,61152 虽然含有 6 和 2,但不是 连号,所以不属于不吉利数字之列。

你的任务是,对于每次给出的一个牌照号区间 [n,m],推断出交管局今后又要实际上给多少辆新的士车上牌照了。

输入格式

输入包含多组测试数据,每组数据占一行。

每组数据包含一个整数对 n 和 m。

当输入一行为“0 0”时,表示输入结束。

输出格式

对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。

数据范围

1≤n≤m≤1e9

输入样例:
1 100
0 0
输出样例:
80
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
 
using namespace std;
 
typedef pair<int, int> PII;
typedef long long ll;

const int N = 15;

ll f[N][10];

void init()
{
	for(int i = 0; i <= 9; i ++)f[1][i] = 1;
	f[1][4] = 0;
	
	for(int i = 2; i < N; i ++)
	{
		for(int j = 0; j <= 9; j ++)
		{
			if(j == 4)continue;
			if(j == 6)
			{
				for(int k = 0; k <= 9; k ++)
				{
					if(k == 2 || k == 4)continue;
					f[i][j] += f[i - 1][k];
				}
				continue;
			}
			for(int k = 0; k <= 9; k ++)
			{
				if(k == 4)continue;
				f[i][j] += f[i - 1][k];
			}
		}
	}
}

int dp(int n)
{
	if(!n)return 1;
	
	vector<int> nums;
	while(n)
	{
		nums.push_back(n % 10);
		n /= 10;
	}
	
	int res = 0, last = 0;
	for(int i = nums.size() - 1; i >= 0; i --)
	{
		int x = nums[i];
		for(int j = 0; j < x; j ++)
		{
			if(j == 4 || last == 6 && j == 2)continue;
			res += f[i + 1][j];
		}
		
		if(last == 6 && x == 2)break;
		if(x == 4)break;
		last = x;
		if(!i)res ++;
	}

	return res;
}

int main()
{
	IOS
	init();
	int x, y;
	while(cin >> x >> y, x)
	{
		cout << dp(y) - dp(x - 1) << endl; 
	}
	
	return 0;
}

恨7不成妻

单身!

依然单身!

吉哥依然单身!

DS 级码农吉哥依然单身!

所以,他平生最恨情人节,不管是 214 还是 77,他都讨厌!

吉哥观察了 214 和 77 这两个数,发现:

2+1+4=7
7+7=7×2
77=7×11

最终,他发现原来这一切归根到底都是因为和 7 有关!

所以,他现在甚至讨厌一切和 7 有关的数!

什么样的数和 7 有关呢?

如果一个整数符合下面三个条件之一,那么我们就说这个整数和 7 有关:

  1. 整数中某一位是 7;
  2. 整数的每一位加起来的和是 7 的整数倍;
  3. 这个整数是 7 的整数倍。

现在问题来了:吉哥想知道在一定区间内和 7 无关的整数的平方和。

输入格式

第一行包含整数 T,表示共有 T 组测试数据。

每组数据占一行,包含两个整数 L 和 R。

输出格式

对于每组数据,请计算 [L,R] 中和 7 无关的数字的平方和,并将结果对 1e9+7 取模后输出。

数据范围

1≤T≤50,
1≤L≤R≤1e18

输入样例:
3
1 9
10 11
17 17
输出样例:
236
221
0

 f[i][j][a][b]表示i位数字,首位为j,模数为a,各个数字之和的模数为b

存三个值:个数、a1+a2+...、a1^{2}+a2^{2}+...

(ja1)^{2} = (j*10^i +a1)^2 =j*j*10^i*10^i+2*j*10^i+a1*a1

所以(ja_1)^2+(ja_2)^2+...=(j*10^i)*t + 2*j*10^i+(a_1+a_2+...)+a_1^2+a_2^2+...

推出这个公式后就能做了

取模很容易出错,建议先写完原式后再添加取模,多注意些

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
 
using namespace std;
 
typedef pair<int, int> PII;
typedef long long ll;

const int N = 20, P = 1e9 + 7;

struct F
{
	ll s0, s1, s2;
}f[N][10][7][7];
ll shi7[N], shi9[N];

int mod(ll x, int y)
{
	return (x % y + y) % y;
}

void init()
{
	for(int i = 0; i <= 9; i ++)
	{
		if(i == 7)continue;
		auto &v = f[1][i][i % 7][i % 7];
		v.s0 = 1;
		v.s1 = i;
		v.s2 = i * i; 
	}
	
	ll res = 10;
	for(int i = 2; i < N; i ++, res *= 10)
	{
		for(int j = 0; j <= 9; j ++)
		{
			if(j == 7)continue;
			
			for(int a = 0; a <= 6; a ++)
			{
				for(int b = 0; b <= 6; b ++)
				{
					for(int k = 0; k <= 9; k ++)
					{
						if(k == 7)continue;
						auto &v = f[i][j][a][b];
						auto &v1 = f[i - 1][k][mod(a - j * res % 7, 7)][mod(b - j, 7)];
						v.s0 = (v.s0 + v1.s0) % P;
						v.s1 = (v.s1 + j * (res % P) % P * v1.s0 % P + v1.s1) % P;
						v.s2 += j * j % P * (res % P) % P * (res % P) % P * v1.s0 % P + 2ll * j * (res % P) % P * v1.s1 % P + v1.s2;
						v.s2 %= P;
					}
				}
			}
		}
	}
	
	shi7[0] = shi9[0] = 1;
	for(int i = 1; i < N; i ++)
	{
		shi7[i] = (shi7[i - 1] * 10) % 7;
		shi9[i] = (shi9[i - 1] * 10) % P;
	}
}

F get(int i, int j, int a, int b)
{
	ll s0 = 0, s1 = 0, s2 = 0;
	for(int u1 = 0; u1 < 7; u1 ++)
	{
		if(u1 == a)continue;
		for(int u2 = 0; u2 < 7; u2 ++)
		{
			if(u2 == b)continue;
			auto &v = f[i][j][u1][u2];
			s0 = (s0 + v.s0) % P;
			s1 = (s1 + v.s1) % P;
			s2 = (s2 + v.s2) % P;
		}
	}
	return {s0, s1, s2};
}

int dp(ll n)
{
	if(!n)return 0;
	
	ll ttt = n % P;	
	vector<int> nums;
	while(n)
	{
		nums.push_back(n % 10);
		n /= 10;
	}
	
	ll res = 0, last_a = 0, last_b = 0;
	for(int i = nums.size() - 1; i >= 0; i --)
	{
		int x = nums[i];
		for(int j = 0; j < x; j ++)
		{
			if(j == 7)continue;
			
			int a = mod(-last_a * shi7[i + 1], 7), b = mod(-last_b, 7);
			auto v = get(i + 1, j, a, b);
			
			res = mod(res + (last_a % P) * (last_a % P) % P * shi9[i + 1] % P * shi9[i + 1] % P * v.s0 % P
			 + 2ll * (last_a % P) * shi9[i + 1] % P * v.s1 % P + v.s2, P);
		}
		
		if(x == 7)break;
		last_a = last_a * 10 + x;
		last_b += x;
		if(!i && last_a % 7 && last_b % 7)res = mod(res + ttt * ttt, P); 
	}
	
	return res % P;
}

int main()
{
	IOS
	init();
	int _;
	cin >> _;
	while(_ --)
	{
		ll l, r;
		cin >> l >> r;
		cout << mod(dp(r) - dp(l - 1), P) << endl;
	}
	
	return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1491193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

堆和二叉树的动态实现(C语言实现)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

【pyinstaller打包记录】Windows系统打包exe后,onnxruntime报警告(Init provider bridge failed)

简介 PyInstaller 是一个用于将 Python 程序打包成可执行文件&#xff08;可执行程序&#xff09;的工具。它能够将 Python 代码和其相关的依赖项&#xff08;包括 Python 解释器、依赖的模块、库文件等&#xff09;打包成一个独立的可执行文件&#xff0c;方便在不同环境中运行…

从零学习Linux操作系统 第三十部分 部署Anisble

一、ansible实验环境的部署 主控机 更改服务器主机名 hostnamectl set-hostname westos_ansible.westos.org 主服务器需要能够实现上网 修改网卡使之能够上网 能ping通 代表可以连接外网 搭载本地软件仓库 并且挂载镜像 装载 dnf install httpd -y 让其开机启动并且…

MySQL王国:从基础到高级的完整指南【文末送书-28】

文章目录 MySQL从入门到精通第一部分&#xff1a;MySQL基础第二部分&#xff1a;MySQL进阶第三部分&#xff1a;MySQL高级应用 MySQL从入门到精通&#xff08;第3版&#xff09;&#xff08;软件开发视频大讲堂&#xff09;【文末送书-28】 MySQL从入门到精通 MySQL是一种开源…

WiFi模块赋能智能手表:拓展功能与提升连接性

随着科技的不断进步&#xff0c;智能手表正逐渐成为现代人生活中不可或缺的智能配饰。其中&#xff0c;WiFi模块的应用为智能手表带来了更多强大的功能和更高的连接性&#xff0c;为用户提供了更为便捷、智能化的使用体验。本文将深入探讨WiFi模块在智能手表中的应用。 远程通信…

vue实现xml,sql,JSON自动格式化高亮

实现xml&#xff0c;json&#xff0c;sql代码组件格式化高亮&#xff1a; 需要下载的依赖&#xff1a; <template><div class"box"><div class"top" v-if"flag"><span class"text">Theme:</span><…

微擎安装,卡在“安装微擎”界面

进入install.php&#xff0c;点击【在线安装】 下一步配置数据库&#xff0c;开始安装系统 然后显示进度条&#xff0c;进度条一闪而过 然后就没有进度条显示了&#xff0c;一直卡在这里 第一次等了好久&#xff0c; 删除目录下的文件&#xff0c;重装还是这样 再重启服务器&…

嵌入式蓝桥杯做题总结

第十二届省赛 按键代码 ——自认为比较巧妙&#xff0c;定时器3被设置为10ms进入一次中断&#xff0c;代替了HAL_Delay(10)的方法消抖&#xff1b; 运用状态机机思想实现检测多个按键检测——且分为两个状态&#xff0c;其中一个状态PB&#xff11;和PB&#xff12;的按键不…

Claude 3 模型列表

claude-3-opus-20240229 这个模型就好

解锁AI大模型秘籍:未来科技的前沿探索

在当今这个技术高速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为了我们生活中不可或缺的一部分。从简单的个人助手到复杂的数据分析和决策制定&#xff0c;AI的应用范围日益扩大&#xff0c;其目的是为了让我们的生活变得更加智能化。本文旨在探讨AI如何…

计网面试题整理下

1. HTTP常见的状态码有哪些&#xff1f; 常见状态码&#xff1a; 200&#xff1a;服务器已成功处理了请求。 通常&#xff0c;这表示服务器提供了请求的网页。301 &#xff1a; (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时&am…

STM32CubeMX学习笔记10 ---低功耗模式

在实际使用中很多产品都需要考虑低功耗的问题&#xff0c;STM32F10X提供了三种低功耗模式&#xff1a;睡眠模式&#xff08;Sleep mode&#xff09;、停机模式&#xff08;Stop mode&#xff09;和待机模式&#xff08;Standby mode&#xff09;。这些低功耗模式可以有效减少系…

gRPC-第二代rpc服务

在如今云原生技术的大环境下&#xff0c;rpc服务作为最重要的互联网技术&#xff0c;蓬勃发展&#xff0c;诞生了许多知名基于rpc协议的框架&#xff0c;其中就有本文的主角gRPC技术。 一款高性能、开源的通用rpc框架 作者作为一名在JD实习的Cpper&#xff0c;经过一段时间的学…

使用postman测试若依登录接口API-2

请求方式 由于登录控制器可知&#xff1a;该请求方式为Post请求 请求地址 在请求路径栏输入请求地址&#xff0c;如下图所示&#xff1a; 参数体 在Body键入所需参数&#xff0c;类型选择raw,数据格式选择"JSON"&#xff1a;如下图所示&#xff1a; 认证成功与失败…

SpringBoot-Thymeleaf

1.概念 Thymeleaf是一个模板引擎&#xff0c;它可以在我们开发前后端混合应用时发挥动态的从后端获取数据&#xff0c;并且展示在前端页面&#xff0c;它的出现代替了JSP 2.入门程序 分析Thymeleaf的源码可知&#xff0c;他的默认路径是templates&#xff0c;并且文件的后缀必须…

低代码平台开发实践:基于React的高效构建与创新【文末送书-29】

文章目录 背景低代码平台简介基于React的优势低代码平台的实际应用 低代码平台开发实践&#xff1a;基于React【文末送书-29】 背景 随着技术的不断进步和业务需求的日益复杂&#xff0c;低代码平台成为现代软件开发领域中备受关注的工具之一。在这个快节奏的时代&#xff0c;…

【QT】Qt Charts概述

目录 1 QtCharts模块 2 图表的主要组成部分 2.1 QChartView的功能 2.2 序列 2.3 坐标轴 2.4 图例 3 一个简单的QChart绘图程序 QtCharts是Qt提供的图表模块&#xff0c;在Qt5.7以前只有商业版才有Qt Charts&#xff0c;但是从Qt5.7开始&#xff0c;社区版本也包含了Qt C…

fortigate 防火墻通過CLT命令行 downgrade降級IOS

​Troubleshooting Tip: Downgrade of FortiOS fails due to BIOS check 通過u盤放入2個文件(Os命名為image.out,配置文件命名為fgt_system.conf),插入 fortigate 防火墻。一般防火墻就自動更新OS,但如果要降級,不會自動更新,需要在CLT裡頭操作一些設置後才能順利降級 …

指针中的回调函数与qsort的深度理解与模拟

今天给大家在更新一下指针类型的知识&#xff0c;这里讲到了一个库函数sqort&#xff0c;以及回调函数的理解。 望喜欢 目录 回调函数 qsort函数 qsort模拟实现 回调函数 回调函数就是⼀个通过函数指针调用的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数…

Java - 获取汉字大写首字母输出

背景 有个项目需要将一批字符串的拼音首字母输出并大写&#xff0c;写了个工具类。 实现 需要引入外部jar。 <dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</artifactId><version>2.5.1</version> </dep…