1. 字母排序
分析——不排序解题
- 创建一个大小为128的数组sheet,序号表示ascii码强转为int表示的数值,对应的数组值表示该ascii码在输入字符串中出现的次数
- 设置一个max变量和id变量,max初值为0,从下标为((int)‘A’)开始遍历sheet数组,找到最大的值赋给max,对应的数组序号赋给id,如果最大的max值为0,表明字符串已经打印完毕了,结束程序。
- 将((char)id)打印max遍,然后回到第二步
代码——32行极简,比其他题解短10行
#include <iostream>
#include <string.h>
using namespace std;
int main() {char str[1001];while (scanf("%s", str) != EOF) {int length = strlen(str);int sheet[128] = {0};for (int i = 0; i < length; i++) {int index = (int)str[i];sheet[index]++;}while (true) {int max = 0;int id;for (int i = (int)'A'; i < 128; i++) {if (sheet[i] > max) {max = sheet[i];id = i;}}if (max == 0) {break;}for (int i = 0; i < max; i++) {printf("%c", (char)id);}sheet[id] = 0;}printf("\n");}
}
2. 动态查找的问题
分析——采用hash表
- 数据总数不超过十万,可以将hash表长设置为十万,采用最简单的线性探测法,一旦发生冲突就往后找
代码
这段代码本来是用vs写的,但是vs这个软件老毛病就是总是觉得你写得不安全,然后不让你编译通过,于是抛弃vs使用dev c++
另外一个让我讨厌的是sql server,珍爱生命,远离ms家的软件。
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
using namespace std;
int num[100001];//静态内存区默认的初始值是0int main() {int n;scanf("%d", &n);for (int i = 0; i < n; i++) {int temp;scanf("%d", &temp);int j = 0;while (true) { //线性探测法if (num[(temp + j) % 100000] == 0) {num[(temp + j) % 100000] = temp;break;}j++;}}int m;scanf("%d", &m);for (int i = 0; i < m; i++) {int temp;scanf("%d", &temp);int j = 0;while (true) { //线性探测法if (num[(temp + j) % 100000] == 0) {printf("no\n");num[(temp + j) % 100000] = temp;break;} else if (num[(temp + j) % 100000] == temp) {printf("find\n");break;}j++;}}return 0;
}
3. 分离字符串
分析
- 使用if判断条件放入指定数组即可
代码
#include <iostream>
#include <string.h>
using namespace std;char abc[201];//字母
char _12[201];//数字
char spe[201];//符号//将每次放入数组的操作写成一个函数,每次放入字符都在后面放一个结束符'\0',这样方便输出
void operate(char *a, int b, char c) {*(a + b) = c;*(a + b + 1) = '\0';
}int main() {char str[201];while (scanf("%s", str) != EOF) {int p_a = 0, p_1 = 0, p_s = 0;int length = strlen(str);for (int i = 0; i < length; i++) {if (str[i] <= 'z' && str[i] >= 'a' || str[i] <= 'Z' && str[i] >= 'A') {operate(abc, p_a++, str[i]);} else if (str[i] <= '9' && str[i] >= '0' ) {operate(_12, p_1++, str[i]);} else {operate(spe, p_s++, str[i]);}}printf("%s\n%s\n%s\n", abc, _12, spe);}return 0;
}
4. 打印杨辉三角形
分析——使用队列构造
- 入队一个1
- 对行数 i i i 开始遍历,每行的元素数目等于行数 i i i
- 第 i i i 行前 i − 1 i-1 i−1 个元素循环执行这样的操作:
- 队首元素值赋temp
- 然后队首出队,打印temp值
- temp值加上当前队首值,和入队
- 第 i i i 行第 i i i 个元素一定是1,因此直接打印1和一个换行符,同时要将一个1入队
b站视频:【【3.6链队列和队列的应用(包括杨辉三角)-2 考研《数据结构C语言版》严蔚敏知识点讲解】】在49:40处对这一过程进行了手动推导,如果对上面的分析不理解,可以点击链接去听一下讲解。
代码
#include <cstdio>
#include <queue>
using namespace std;int main() {int n;while (scanf("%d", &n) != EOF) {queue<int> tri;tri.push(1);for (int i = 0; i < n; i++) {//行遍历for (int j = 0; j < i; j++) {int temp = tri.front(); //获取队首tri.pop();printf("%d ", temp);temp += tri.front();tri.push(temp);}tri.push(1);printf("1\n");}}return 0;
}
5. 回文数判定
分析
数字位数都确定是5位了,直接用字符串接住,看看0和4序号、1和3序号的数字是不是一样的就好
代码
#include <cstdio>
#include <queue>
using namespace std;int main() {char num[5];while (scanf("%s", num) != EOF) {getchar();if (num[0] == num[4] && num[1] == num[3]) {printf("Yes\n");} else {printf("No\n");}}return 0;
}
6.求三角形面积
分析——使用正弦公式计算面积
代码
#include <cstdio>
#include <queue>
#include <cmath>
using namespace std;struct position {double x;double y;
};
position tri[3];void caculate(double *str) {for (int i = 0; i < 3; i++) {tri[i].x = str[i * 2];tri[i].y = str[i * 2 + 1];}position a, b;a.x = tri[1].x - tri[0].x;a.y = tri[1].y - tri[0].y;b.x = tri[2].x - tri[0].x;b.y = tri[2].y - tri[0].y;double a_length = sqrt(pow(a.x, 2) + pow(a.y, 2));double b_length = sqrt(pow(b.x, 2) + pow(b.y, 2));double cos = (abs(a.x * b.x + a.y * b.y)) / (a_length * b_length);double sin = sqrt(1 - pow(cos, 2));double s = 0.5 * a_length * b_length * sin;printf("%.2lf\n", s);
}int main() {double str[6];while (scanf("%lf", &str[0]) != EOF) {for (int i = 1; i < 6; i++) {scanf("%lf", &str[i]);}caculate(str);}return 0;
}
注意点
- 所有的数值类型都应该是double,否则会报错
- 下面这行代码,如果乘法不加括号,会出现错误答案
double cos = (abs(a.x * b.x + a.y * b.y)) / (a_length * b_length);
分析——使用海伦公式计算面积
【海伦公式】
代码
#include<bits/stdc++.h>
using namespace std;
struct point{double x;double y;
}A,B,C;double len(point a,point b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main(){while(scanf("%lf %lf %lf %lf %lf %lf",&A.x,&A.y,&B.x,&B.y,&C.x,&C.y)!=EOF){double ac = len(A,C);double ab = len(A,B);double bc = len(B,C);double p = (ac+bc+ab)/2;double s = sqrt(p*(p-ac)*(p-bc)*(p-ab));printf("%.2lf\n",s);}
}