碎片知识

1.大小写字母和数字之间的转换
将0到25分别变成A到Z,26-51分别变成a到z:

char country(int i) {
    if(i < 26) return 'A' + i;
    return 'a' + i - 26;
}

将a到z分别变成0到25:

char c; int x; x = c - 'a';
char c; int x; x = c -1;

将a到z分别变成1到26:

char c; int x; x = c -0;

将A到Z分别变成0到25:

char c; int x; x = c - 'A';

2.在C++程序里加std::ios::sync_with_stdio(false);可以取消cin, cout与stdio的同步(提高cin, cout的速度)。

3.s.substr(x);返回s字符串中从’x’到结尾的字符。string str; str.substr(start, end - start);返回str中从start到end - start字符的拷贝。str.c_str();生成一个const char* 指针,指向以空字符终止的数组。

4.vector有vector.size()个元素,vector v(n, 0); v容器用n个0初始化。

5.sscanf函数作用 char *str; sscanf(str, 格式控制字符串, ., .,.); ...是多个变参,用来保存前面str中符合格式控制字符串的内容。%[a-z] 匹配所有小写字符,直到遇到不是小写字符;%[a-zA-Z] 匹配所有字符,直到遇到不是字符;%[0-9] 匹配所有·数字,直到遇到不是数字;%[^xxx];匹配所有字符,直到遇到xxx。

6.sscanf()中通过%s输入的字符串若含空格则首个空格之后的串将被忽略,gets()函数允许字符串存在多个空格。

7.反向输出循环

num[n]; for(int i = 0; i < n; i++) cout << num[n-i-1];
num[n+n]; for(int i = 0; i < n; i++)
			for(int j = 0; j < n; j++)
				cout << num[n - i + n - j - 2];

8.sprintf(char, 控制字符串, 字符串, …); 把字符串按控制字符串格式写入char*指向的。 %05d,右对齐,输出至少为5位,不足5位用0填充。*

9.lower_bound()和upper_bound()
lower_bound()返回一个非递减序列[first, last)中的第一个大于等于值val的位置,upper_bound()返回一个非递减序列[first, last)中第一个大于val的位置。
在这里插入图片描述
10.完全二叉树结点k的左子结点、右子结点的编号分别是2k和2k+1。

11.m/n上取整:m+n-1/n.

12.l到r的长度:r-l+1.

13.strlen计算字符串长度时不算结尾的’\0’.

14偶数异或1结果为该数加一,奇数异或1结果为该数减一。

15散列表不同映射方法总结(假设散列函数 h(x) = x(mod 10)),要插入4371,1323,6173,4199,4344,9679,1989
a. 分离链接散列表:对要插入的数字分别mod10,插入对应结果在散列表对应的数值位置,在该位置上形成一条链,后续插入的数字在对应位置的链末尾继续插入,结果如下图:
在这里插入图片描述
b. 使用线性探测的散列表:对要插入的数字mod10,插入对应结果在散列表对应的数值位置,如果发生冲突,则一步一步地往下寻找空位进行插入,如果到达散列表的末尾,则从头开始继续寻找空位,结果如下:
在这里插入图片描述
c. 使用平方探测的散列表:对要插入的数字mod10,插入对应结果在散列表对应的数值位置,如果发生冲突,如果一下个位置为空则插入到下一个位置,否则从对1开始的数i进行平方再加上该数字mod10的结果再mod10,把该数插入到散列表对应数字位置中,在这里6173插入与1323冲突,但是1323的下一个位置为空,所以6173插入4的位置,当插入4344和9679时也是如此,最后插入1989时,下一个位置已有元素故不能插入,接着1989mod10等于9,取i为2,(9 + 2^2) % 10 = 3,3位置已有元素,接着i取3,利用同样方法计算得到结果为8,散列表8对应的位置为空,插入成功,结果如下:
在这里插入图片描述
d. 二级散列函数为 h2(x) = 7 - x(mod 7)的散列表:对要插入的数字mod10,插入对应结果在散列表对应的数值位置,如果发生冲突,按上式代入相应的数字进行计算,得到结果n表示从冲突位置的下一个开始往下n步,把数字插入到那个位置,如果那个位置仍然是满的,则继续往下移动n步,直到找到空位为止,结果如下图所示:
在这里插入图片描述
16. if if if 和 if else if else的区别:第一种if条件若满足多个的话条件语句都可以执行,第二个只要满足一个条件就不再继续往下判断。

17.C++STL中的二叉堆是用 priority_queue 的类模板实现的,STL实现的是最大堆,若要变成最小堆,可以改为 p r i o r i t y priority priority_ q u e u e queue queue< i n t , v e c t o r < i n t > , int, vector<int>, int,vector<int>, greater< i n t int int> >。

18.不用$ if 和 else $找出两个数中的较大值: m a x ( a , b ) = ( ( a + b ) + a b s ( a − b ) ) / 2 max(a,b) = ((a + b) + abs(a - b)) / 2 max(a,b)=((a+b)+abs(ab))/2

19.使用位运算计算绝对值:int8_t (var ^ (var >> 7)) - (var >> 7)
int16_t (var ^ (var >> 15)) - (var >> 15)
int32_t (var ^ (var >> 31)) - (var >> 31)
int64_t (var ^ (var >> 63)) - (var >> 63)

20.输入 N N N行,然后读取 N N N行数据到一个数组

#include <string>
#include <sstream>
#include <iostream>
using namespace std;

int a[100], n;

int main()
{
	int N;
	string s;
	cin >> N;
	getline(cin, s);
	while (N—) {
		getline(cin, s);
		stringstream ss(s);
		while (ss >> a[n])
			n++;
	}
	for (int i = 0; i < n; i++)
		cout << a[i] << “ “;
	cout << endl;
	return 0;
}

20.三维数组的含义:有一个三维数组,比如 a [ 2 ] [ 3 ] [ 4 ] a[2][3][4] a[2][3][4]的意思是 a a a数组有 2 2 2 3 3 3 4 4 4 列的数组,也就是如果放到空间直角坐标系的话数组第一个位置表示的是 z z z,第二个位置表示的是 x x x,第三个位置表示的是 y y y

21.将字符串的小写字母变大写字母,大写字母变小写字母:s[i] ^= 32,因为在ASCII码中,英文字母的小写字母都比其对应的大写字母大32。

22.将输入的整数的各个数位相加直到和只有一位为止

#include <iostream>
using namespace std;

int main()
{
    int num, sum = 0;
    while (cin >> num && num != 0) {
        while (num > 9) {
            sum = num;
            num = 0;
            while (sum > 0) {
                num += sum % 10;
                sum /= 10;
            }
        }
        cout << num << endl;
    }
    return 0;
}

23.将字符串中1-9变为十进制数的1-9,A-F变为十进制数的10-15,a-f变为十进制数的10-15:

char n[maxn];
scanf("%s", n);
int i;
int len = strlen(n);
for (i = len - 1; i >= 0; i--) {
    if (n[i] >= '0' && n[i] <= '9')
        n[i] = n[i] - '0';
    else if (n[i] >= 'A' && n[i] <= 'F')
        n[i] = n[i] - 'A' + 10;
    else
        n[i] = n[i] - 'a' + 10;
}

24.将a进制数转换为10进制数:

int a;
char n[maxn];
scanf("%d%s%d", &a, n);
int i, num, sum = 0, p = 1;
int len = strlen(n);
for (i = len - 1; i >= 0; i--) {
    if (n[i] >= '0' && n[i] <= '9')
        num = n[i] - '0';
    else if (n[i] >= 'A' && n[i] <= 'F')
        num = n[i] - 'A' + 10;
    else
        num = n[i] - 'a' + 10;
    sum = sum + num * p;
    p *= a;
}
printf("%d\n", sum);

25.判断数字 n 的第 j 位是否为 1:

if (n >> j & 1)

26.整形数转 string :

int a;
string s;
s += (a + '0');
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值