【算法练习】刷算法题时的技巧

程序结构

执行T次循环

最简洁的写法是while(T–)

T = 5;
while(T--){
	printf("%d", T);
}

将数字转换成d进制

// 转换进制
int ans[31] = {0}, num = 0;
do {
	ans[num ++] = sum % d;  // 每次取余 
	sum /= d;  // 对余数进行下一轮计算
} while(sum != 0);
for(int i = num - 1; i >= 0; i--){  // 从高位开始输出 
	printf("%d", ans[i]);
}

变量类型

int

数据范围 [- 2 63 2^{63} 263, 2 63 2^{63} 263-1]

long long

数据范围 [- 2 31 2^{31} 231, 2 31 2^{31} 231]

long long a;
printf("%lld", &a);

double

printf("%lf", &a);

读入/输出

读入一组数据

数据个数n

int n;
scanf("%d", &n);
int a[n];
for(int i = 0; i < n; i++){
    scanf("%d", &a[i]);
    printf("%d", a[i]);
}

读入字符

读取字符时,为了防止读入空格,使用getchar()更好

getchar(c);

读入一串字符串

gets(str);

读入一系列字符串

定义二维数组:适用于输出一系列字符串,输出时请使用ans[i]
例如:

char ans[90][90];
for(int i = num - 1 ; i >= 0 ; i--) {
	printf("%s", ans[i]);
	if(i != 0) printf(" ");
}

字符串拼接

str = str1 + str2;
printf("%s", str);

函数

数学运算

abs()

绝对值

reverse

功能:逆序(或反转),多用于字符串、数组、容器。头文件是

#include <algorithm>

reverse函数用于反转在[first,last)范围内的顺序(包括first指向的元素,不包括last指向的元素),reverse函数无返回值

// 对字符串
string str="hello world , hi";
reverse(str.begin(),str.end());//str结果为 ih , dlrow olleh
// 对容器
vector<int> v = {5,4,3,2,1};
reverse(v.begin(),v.end());//容器v的值变为1,2,3,4,5

参考文章:C++ reverse函数的用法

全排列

// 首先对数列排序(从小到大)
sort(a, a + n);

注意

  1. 最后一个输出后面不能有空格
if(count < n){  //如果输出的个数小于n,则输出空格
	printf(" ");
}
  1. 以变量作为数组下标,查找元素更加方便,例如:B1041.考试座位号

排序

假如有一个结构体

struct Student{
	char name[10];
	int score;
}stu;

main函数中,需要加入一个比较函数 cmp():

 sort(stu, stu+n, cmp); // stu:需要排序的数组  n:需要排序的数组的大小

整型从大到小排序

实现从大到小的排序

bool cmp(Student a, Student  b)
{
	return a.score > b.score;  //从大到小排序
}

字符串按字典序从小到大排序

bool cmp(Student a, Student b)
{
	int s = strcmp(a.name, b.name);
	if(s != 0) return s < 0;  // 从小到大
	// 如果要从大到小,则 return s > 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值