1.取值范围
2. 字符串
取长度
String s 可以使用s.size() | s.length() 取得长度
char s[] 可以使用strlen(s) 取得长度
提取字符串:
s.substr(pos, len) ;pos的默认值是0 len默认为pos到最后一个字符的长度
插入字符串
s.insert(pos, str); //pos 起始位置 str 字符串
删除字符串
s1.erase(5); //从第五个位置开始往后面都删除
s1.erase(5, 3); //从第五个位置开始往后面删除3个字符
字符串查找
3.输入
3.读取桌面文件快速输入
#include <cstdio>
freopen("C:\\Users\\HK\\Desktop\\temp.txt","r",stdin);
4.求最大公约数GCD 最小公倍数LCM
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b)
{
return a * b / gcd(a,b) ;
}
5.取余(得正数)
x 对 N 取余,因为x余N 的值必在 -N 和 N之间,这时加上N就必为正数,再取余就是正的余数。
int yu = (x % N + N) % N;
6.闰年计算 时间显示
int mon[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
//月份表示mon[i] 表示 i 月
int loop(int x) //求闰年 如果是闰年直接返回 1 让二月份加 1 即可
{
int y = 0;
if(x % 4 ==0 && x % 100 != 0 || x % 400 == 0) y = 1;
return y;
}
//时间显示 时间戳化成时间
const LL day = 86400;
t /= 1000; // 化成秒
LL time = t % day; //对天取余
int h = time / 3600;
int m = (t / 60) % 60;
int s = time % 60;
EXCEL计算天数
EXCEL计算星期几
7.进制转换
#include<bitset> //转为2进制的头文件
#include <iostream>
using namespace std;
int main()
{
int n; cin >> n;
bitset<8> a(n);
cout << a << endl;
return 0;
}
//十六进制转八进制
long long n;
cin >> hex >>n;
cout << oct <<n ;
//十六进制转十进制
long long a;
scanf("%x", &a);
printf("%lld\n",a);
8.全排列 next_permutation(a, a + n)
9.输出格式
总结:点前面为 小数点前面有X保留X位 X前面有0就是补零(没有就默认为空格补齐)
点后面就是小数掉保留几位
10.数组复制
//复制st数组到backup数组
memcpy(backup, st, sizeof st);
11.计算阶层
//计算C(a,b)这种阶层的
LL C(int a, int b) //计算C(a,b)
{
LL res = 1;
for(int i = a, j = 1; j <= b; i --, j ++)
{
res = res * i / j;
}
return res;
}
11.树状数组
//lowbit 返回最低位 1 的值
int lowbit(int x)
{
return x & -x;
}
void add(int x, int v)
{
for (int i = x; i <= n; i += lowbit(i)) tr[i] += v;
}
int query(int x) //求子数列[a,b]的和 //0 1 3 ,求1~3的和
{
int res = 0;
for (int i = x; i; i -= lowbit(i)) res += tr[i];
return res;
}
12.排序
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(int a,int b) //进行降序排序
{
return a > b;
}
int main()
{
int a[]={1,2,5,6,4};
// sort(a, a + 5, greater<int>()); //降序
// sort(a, a + 5, less<int>()); //升序
// sort(a, a + 5) //升序
sort(a, a + 5, cmp);//降序
for(int i = 0; i < 5; i ++) cout << a[i] << " ";
return 0;
}
13.获取该数二进制表示中1的个数
int get_count(int x)
{
int res = 0;
while (x)
{
res ++ ;
x -= x & -x; //x & -x 取最低位 1; x 减去最低位1
}
return res;
}
归并排序
//merge_sort(q, 0, n - 1);
void merge_sort(int q[], int l, int r) // 归并排序
{
if (l >= r) return;
int mid = l + r >> 1;
merge_sort(q, l, mid);
merge_sort(q, mid + 1, r);
int k = 0, i = l, j = mid + 1;
while (i <= mid && j <= r)
if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
else tmp[k ++ ] = q[j ++ ];
while (i <= mid) tmp[k ++ ] = q[i ++ ];
while (j <= r) tmp[k ++ ] = q[j ++ ];
for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
}
优先队列,每次取小的进行合并 ---->>原题
priority_queue<int, vector<int>, greater<int>> heap;
//声明 heap 为堆 ,第一个int 为排序判断的数据类型
//vector (也就是第二个参数)填写的是来承载底层数据结构堆(heap)的容器
//第三个参数less-则是对第一个参数的比较类, less表示数字大的优先级越大,
//而greater表示数字小的优先级越大。
//heap.push(x);
//heap.pop();
//heap.size()
快速排序
//quickSort(1, n);
void quickSort(int l, int r) {
if (l >= r) return;
int i = l, j = r, base = a[l]; //base取最左边的数为基准数
while(i < j) {
while (a[j] >= base && i < j) j--;
while (a[i] <= base && i < j) i++;
if (i < j) swap(a[i], a[j]);
}
a[l] = a[i]; a[i] = base; //基准数归位
quickSort (l, i - 1); //递归左边
quickSort (i + 1, r); //递归右边
}
13.STL
#include <iostream>
#include <vector>
using namespace std;
int main()
{
// 创建一个向量存储 int
vector<int> vec; int i;
// 推入 5 个值到向量中
for(i = 0; i < 5; i++) vec.push_back(i);
// 使用迭代器 iterator 访问值
vector<int>::iterator v = vec.begin();
while( v != vec.end())
{
cout << "value of v = " << *v << endl;
v++;
}
return 0;
}
#include<set>
set<pair<double, double> > lines; //可以存放去重的点
lines.insert(pair<double, double>(k, b)) //添加
14.测试数据
- 考虑边界情况 极端情况 如为0 为负数等…
- 考虑数据的取值范围 需不需要用long long 或unsigned long long
- 观察给出的数据规模 有没有坑 如从0 或 负 价值,
- 数据量大的情况下 太多的递归可能会超时
- 输出结果后记得及时返回
- 行列for循环 i j n m 看看有没有写错