C语言精选100道编程题(附有图解和源码)
文章目录
- C语言精选100道编程题(附有图解和源码)
- 1. 打印 1~100 之间的奇数
- 2. 打印9*9乘法⼝诀表
- 3. 打印素数
- 4. 判断三角形
- 5. 计算最⼤公约数
- 6. 打印最⼩公倍数
- 7. 分数求和
- 8. 计算最⼤值和最⼩值的差值
- 9. 排序整形数组
- 10. 找出盗窃者
- 11. ⾃幂数
- 12. 打印菱形
- 13. 喝多少瓶汽⽔
- 14. 字符转换
- 15. 交换两个整数
- 16. 求两个整数的平均值
- 17. 求字符串长度
- 18. 求字符串长度【进阶版】
- 19. 逆序字符串
- 20. 求数字的每⼀位之和
- 21. 判断回⽂字符串
- 22. 计算天数
- 23. 删除指定的数
- 24. 字符串拷贝
- 25. 合并有序数组
- 26. 两整数相加 - 题号2235
- 27. 猜数字 - 题号LCP 01
- 28. 温度转换 - 题号2469
- 29. 最⼩偶倍数 - 题号 2413
- 30. 数组异或操作 - 题号1486
- 31. 数组元素和与数字和的绝对差
- 32. 回⽂数 - 题号:9
- 33. 有多少⼩于当前数字的数字
- 34. 字⺟在字符串中的百分⽐
- 35. ⾯试题 01.01. 判定字符是否唯⼀
- 36. IP 地址⽆效化 - 题号:1108
- 37. 句⼦中的最多单词数
- 38. 反转两次的数字 - 题号:2119
- 39. 找出数组的最⼤公约数-题号:1979
- 40. 统计位数为偶数的数字-题号:1295
- 41. 分割数组中数字的数位-题号:2553
- 42. 速算机器⼈-题号:LCP17
- 43. 转换成⼩写字⺟-题号:709
- 44. 找出中枢整数-题号:2485
- 45. 公因⼦的数⽬-题号:2427
- 46. 执⾏操作后的变量值-题号:2011
- 47. 设计停车系统-题号:1603
- 48. 翻转图像-题号:832
- 49. 链表中倒数第k个节点-题号:剑指offer22
- 50. ⼆进制链表转整数-题号:1290
- 51. 矩阵对角元素的和-题号:1572
- 52. 汉明距离-题号:461
- 53. 只出现⼀次的数字Ⅲ-题号:260
- 54. 颠倒⼆进制位-题号:190
- 55. 检查两个字符串数组是否相等-题号:1662
- 56. 按⾝⾼排序-题号:2418
- 57. 删除每⾏中的最⼤值-题号:2500
- 58. 最富有客⼾的资产总量-题号:1672
- 59. 统计能整除数字的位数-题号:2520
- 60. 重新排列数组-题号:1470
- 61. 矩阵中的局部最⼤值-题号:2373
- 62. 判断句⼦是否为全字⺟句-题号:1832
- 63. 宝⽯与⽯头-题号:771
- 64. 交替数字和-题号:2544
- 65. 找到最⾼海拔-题号:1732
- 66. 整数的各位积和之差-题号:1281
- 67. 统计⼀致字符串的数⽬ - 题号:1684
- 68. 左旋转字符串 - 题号:剑指 Offer 58 - Ⅱ
- 69. 解码异或后的数组
- 70. 好数对的数⽬ - 题号:1512
- 71. 拥有最多糖果的孩⼦ - 题号:1431
- 72. 第⼀个出现两次的字⺟
- 73. 统计星号 - 题号:2315
- 74. 数组串联 - 题号:1929
- 75. 左右元素和的差值 - 题号:2574
- 76. 爬楼梯 - 题号:70
- 77. ⼆进制中1的个数 - 题号:剑指 Offer 15
- 78. ⼆分查找 - 题号:704
- 79. 删除有序数组中的重复项
- 80. 排序矩阵查找 - 题号:⾯试题 10.09
- 81. 只出现⼀次的数字 - 题号:136
- 82. 反转字符串 - 题号:344
- 83. 字符串中的第⼀个唯⼀字符 - 题号:387
- 84. 找出星型图的中⼼节点 - 题号:1791
- 85. 两个数对之间的最⼤乘积差
- 86. 杨辉三⻆ - 题号:118
- 87. 替换空格 - 题号:剑指Offer 05
- 88. 各位相加 - 题号:258
- 89. 按奇偶排序数组 - 题号:905
- 90. 分割平衡字符串 - 题号:1221
- 91. 差的绝对值为k的数对数⽬ - 题号:2006
- 92. 打印从1到最⼤的n位数
- 93. ⽣成每种字符都是奇数个的字符串 - 题号:1374
- 94. 将每个元素替换为右侧最⼤元素 - 题号:1299
- 95. 交替合并字符串
- 96. 合并两个有序数组 - 题号:88
- 97. ⾼度检查器 - 题号:1051
- 98. 找出数组排序后的⽬标下标 - 题号:2089
- 99. 反转链表 - 题号:剑指 Offer 24
- 100. 合并两个排序的链表 - 题号:剑指 Offer 25
- 整体的心得
- 整体源代码
前面25道题都是在vs2019/vs2022本地环境下编写算法
后面25-100道题是在线OJ环境下编写算法
1. 打印 1~100 之间的奇数
代码如下(示例):
// 1. 打印1-100的奇数
int main()
{
int i = 0;
for (i = 1; i <= 100; i++)
{
if (i % 2 == 1)
printf("%d ", i);
}
return 0;
}
int main()
{
int i = 0;
for (i = 1; i <= 100; i += 2)
{
printf("%d ", i);
}
return 0;
}
2. 打印9*9乘法⼝诀表
代码如下(示例):
// 打印9*9乘法表
int main()
{
int i, j;
for (i = 1; i <= 9; i++)
{
for (j = 1; j <= i; j++)
{
printf("%d*%d=%2d ", i, j, i * j);
}
printf("\n");
}
}
3. 打印素数
代码如下(示例):
// 打印100-200的素数
//int main()
//{
// int i = 0;
// int j = 0;
// for (i = 100; i <= 200; i++)
// {
// int flag = 1;
// for (j = 2; j < i ; j++)
// {
// if (i % j == 0)
// {
// flag = 0;//不是素数
// break;
// }
// }
// if (flag == 1)
// printf("%d ", i);
// }
//}
// 优化版本
#include<math.h>
int main()
{
int i = 0;
int j = 0;
for (i = 101; i < 200; i+=2)
{
int flag = 1;
for (j = 2; j <= sqrt(i); j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
printf("%d ", i);
}
}
4. 判断三角形
代码如下(示例):
// 判断三角形
//int main()
//{
// int a, b, c;
// scanf("%d %d %d", &a, &b, &c);
// if ((a + b > c && a - b < c) || (b + c > a && b - c < a) || (a + c > b && a - c < b))
// {
// if ((a == b) && (a != c) || (a == c) && (a != b) || (b == c) && (b != a))
// printf("等腰三角形\n");
// else if (a == b && b == c)
// printf("等边三角形\n");
// else
// printf("普通三角形\n");
// }
// else
// {
// printf("非三角形\n");
// }
//}
// 判断三角形
int main()
{
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
if (a + b > c && b + c > a && a + c > b)
{
if (a == b && b == c)
printf("等边三角形");
else if (a == b || a == c || b == c)
printf("等腰三角形");
else
printf("普通三角形");
}
else
{
printf("非三角形");
}
}
5. 计算最⼤公约数
代码如下(示例):
// 求最大公约数
int main()
{
int a, b;
int i = 0;
scanf("%d %d", &a, &b);
int c = (a > b ? b : a);
for (i = c; i >=1; i--)
{
if (a % i == 0 && b % i == 0)
{
printf("%d\n", i);
break;
}
}
}
//int main()
//{
// int a, b;
// int i = 0;
// scanf("%d %d", &a, &b);
// int c = (a > b ? b : a);
// while (1)
// {
// if (a % c == 0 && b % c == 0)
// {
// break;
// }
// c--;
// }
// printf("%d\n", c);
// return 0;
//}
代码如下(示例):
int main()
{
int a, b;
scanf("%d %d", &a, &b);
int k = 0;
while (k = a % b)
{
a = b;
b = k;
}
printf("%d\n", b);
}
//辗转相除法递归实现
int gcd(int a, int b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
6. 打印最⼩公倍数
代码如下(示例):
// 求两个数的最小公倍数 方法一
//int main()
//{
// int a = 0;
// int b = 0;
// scanf("%d %d", &a, &b);
// int c = (a > b ? a : b);
// for (int i = c; i < a * b; i++)
// {
// if (i % a == 0 && i % b == 0)
// {
// printf("%d\n", i);
// break;
// }
// }
//}
//求两个数的最小公倍数 方法二
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int c = a * b;
int k = 0;
// 辗转相除法求最大公约数 b
while (k = a % b)
{
a = b;
b = k;
}
printf("%d\n", c / b);
}
7. 分数求和
代码如下(示例):
int main()
{
int i = 0;
double sum = 0;
for (i = 1; i <= 100; i++)
{
if (i % 2 == 1)
sum += 1.0 / i;
else
sum -= 1.0 / i;
}
printf("%lf\n", sum);
}
8. 计算最⼤值和最⼩值的差值
代码如下(示例):
// 第一种方法
//void bubblesort(int arr[], int sz)
//{
// int i = 0;
// for (i = 0; i < sz - 1; i++)
// {
// int j = 0;
// for (j = 0; j < sz - 1 - i; j++)
// {
// if (arr[j] > arr[j + 1])
// {
// int tmp = arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = tmp;
// }
// }
// }
//}
//int main()
//{
// int arr[10] = { 0 };
// int i = 0;
// for (i = 0; i < 10; i++)
// {
// scanf("%d", &arr[i]);
// }
// int sz = sizeof(arr)/sizeof(arr[0]);
// bubblesort(arr, sz);
// printf("%d\n", arr[9] - arr[0]);
//
//}
// 第二种方法
//int main()
//{
// int arr[10] = { 0 };
// int i = 0;
// for (i = 0; i < 10; i++)
// {
// scanf("%d", &arr[i]);
// }
// int Max = arr[0];
// int Min = arr[0];
// for (i = 1; i < 10; i++)
// {
// if (arr[i] > Max)
// Max = arr[i];
// if (arr[i] < Min)
// Min = arr[i];
// }
// printf("%d\n", Max - Min);
// return 0;
//}
// 第三种方法
int main()
{
int arr;
scanf("%d", &arr);
int Max = arr;
int Min = arr;
int i = 0;
for (i = 1; i < 10; i++)
{
scanf("%d", &arr);
if (arr > Max)
Max = arr;
if (arr < Min)
Min = arr;
}
printf("%d\n", Max - Min);
return 0;
}
9. 排序整形数组
代码如下(示例):
// 冒泡排序
//void BubbleSort(int arr[], int sz)
//{
// int i = 0;
// int j = 0;
// for (i = 0; i < sz - 1; i++)
// {
// for (j = 0; j < sz - 1 - i; j++)
// {
// if (arr[j] > arr[j + 1])
// {
// int tmp = arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = tmp;
// }
// }
// }
//}
//void arrPrintf(int arr[], int sz)
//{
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// printf("%d ", arr[i]);
// }
//}
//int main()
//{
// int arr[10] = { 0 };
// int i = 0;
// int sz = sizeof(arr) / sizeof(arr[0]);
// for (i = 0; i < 10; i++)
// {
// scanf("%d", &arr[i]);
// }
// BubbleSort(arr, sz);
// arrPrintf(arr, sz);
//}
//#include <stdio.h>
//int main()
//{
// int arr[10] = { 0 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// scanf("%d", &arr[i]);
// }
// for (i = 0; i < sz - 1; i++)
// {
// int j = 0;
// int flag = 1;//假设待排序的数据已经有序
// for (j = 0; j < sz - 1 - i; j++)
// {
// if (arr[j] > arr[j + 1])
// {
// flag = 0;
// int tmp = arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = tmp;
// }
// }
// if (flag == 1)
// break;
// }
// for (i = 0; i < sz; i++)
// {
// printf("%d ", arr[i]);
// }
// return 0;
//}
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < sz - 1; i++)
{
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
10. 找出盗窃者
代码如下(示例):
// 判断盗窃者
int main()
{
int thieves = 0;
for (thieves = 'a'; thieves <= 'd'; thieves++)
{
if ((thieves != 'a') + (thieves == 'c') + (thieves == 'd') + (thieves != 'd') == 3)
printf("盗窃者是: %c", thieves);
}
}
11. ⾃幂数
代码如下(示例):
// 判断自幂数
#include <math.h>
int main()
{
int i = 0;
for (i = 1; i <= 100000; i++)
{
//判断i是否是⾃幂数
//1. 计算i的位数n
int n = 1;
int tmp = i;
while (tmp / 10)
{
n++;
tmp /= 10;
}
//2. 计算i的每⼀位的n次⽅之和
tmp = i;
int sum = 0;
while (tmp)
{
sum += (int)pow(tmp % 10, n);
tmp /= 10;
}
//3. 输出
if (sum == i)
printf("%d ", i);
}
return 0;
}
12. 打印菱形
代码如下(示例):
int main()
{
int n = 0;
scanf("%d", &n);
//打印上半部分的n行
int i = 0;
for (i = 0; i < n; i++)
{
int j = 0;
for (j = 0; j < n - 1 - i; j++)
{
printf(" ");
}
for (j = 0; j < 2 * i + 1; j++)
{
printf("*");
}
printf("\n");
}
//打印下半部分的n-1⾏
for (i = 0; i < n; i++)
{
int j = 0;
for (j = 0; j <= i; j++)
{
printf(" ");
}
for (j = 0; j < 2 * (n - 1 - i) - 1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
13. 喝多少瓶汽⽔
代码如下(示例):
// 喝多少汽水
//int main()
//{
// int n = 0;
// scanf("%d", &n);
// int total = 0;
// int empty = 0;
// total += n;
// empty += n;
// while (empty >= 2)
// {
// total += empty / 2;
// empty = empty / 2 + empty % 2;
// }
// printf("%d\n", total);
//}
// 第二种方法
int main()
{
int n = 0;
int total = 0;
scanf("%d", &n);
if (n == 0)
total = 0;
else
total = 2 * n - 1;
printf("%d\n",total);
return 0;
}
14. 字符转换
代码如下(示例):
//方法一:不使用库函数
int main()
{
char buf[31] = { 0 };
scanf("%[^\n]", buf);
int i = 0;
while (buf[i])
{
if (buf[i] >= 'a' && buf[i] <= 'z')
buf[i] -= 32;
else if (buf[i] >= 'A' && buf[i] <= 'Z')
buf[i] += 32;
i++;
}
printf("%s\n", buf);
return 0;
}
//⽅法2:使⽤库函数
#include <ctype.h>
int main()
{
char buf[31] = { 0 };
scanf("%[^\n]s", buf);
int i = 0;
while (buf[i])
{
if (islower(buf[i]))
buf[i] = toupper(buf[i]);
else if (isupper(buf[i]))
buf[i] = tolower(buf[i]);
i++;
}
printf("%s\n", buf);
return 0;
}
15. 交换两个整数
代码如下(示例):
// 交换两个整数
void Swap(int* pa, int* pb)
{
int tmp = *pa;
*pa = *pb;
*pb = tmp;
}
int main()
{
int a, b;
scanf("%d %d", &a, &b);
Swap(&a, &b);
printf("%d %d\n", a, b);
}
16. 求两个整数的平均值
代码如下(示例):
// 求两个整数的平均值
int average(int a, int b)
{
return (a+b)/2;
}
int average(int a, int b)
{
return a+(b-a)/2;
}
int main()
{
int a, b;
scanf("%d %d", &a, &b);
int ret = average(a, b);
printf("%d\n", ret);
}
17. 求字符串长度
18. 求字符串长度【进阶版】
代码如下(示例):
// 求字符串长度
//模拟实现strlen函数的第一种方法
//#include<assert.h>
//size_t my_first_strlen(const char* string)
//{
// assert(string);
// int count = 0;
// while (*string != '\0')
// {
// string++;
// count++;
// }
// return count;
//}
//int main()
//{
// char arr[10] = "abcdef";
// int ret = my_first_strlen(arr);
// printf("%d\n", ret);
// return 0;
//}
// 第二种方法:递归
//#include<assert.h>
//size_t my_second_strlen(const char* str)
//{
// assert(str != NULL);
// if (*str != '\0')
// {
// return 1 + my_second_strlen(str + 1);
// }
// else
// {
// return 0;
// }
//}
//int main()
//{
// char arr[10] = "abcdef";
// int ret = my_second_strlen(arr);
// printf("%d\n", ret);
// return 0;
//}
// 第三种方法:指针-指针
#include<assert.h>
size_t my_third_strlen(const char* str)
{
assert(str != NULL);
const char* start = str;
while (*str != '\0')
{
str++;
}
return str - start;
}
int main()
{
char arr[10] = "abcdef";
int ret = my_third_strlen(arr);
printf("%d\n", ret);
return 0;
}
19. 逆序字符串
代码如下(示例):
// 逆序字符串
#include<string.h>
void reverse(char* arr)
{
int ret = strlen(arr);
char* left = arr;
char* right = arr + ret - 1;
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[31] = { 0 };
scanf("%[^\n]", arr);
reverse(arr);
printf("%s\n", arr);
}
20. 求数字的每⼀位之和
代码如下(示例):
// 方法二
int digit_sum(int m)
{
int sum = 0;
while (m)
{
sum += m % 10;
m /= 10;
}
//返回每⼀位的和
return sum;
}
// 求数字的每一位之和
// 方法一
int main()
{
int n = 0;
scanf("%d", &n);
int sum = 0;
while (n / 10)
{
sum += n % 10;
n /= 10;
}
sum += n % 10;
printf("%d\n", sum);
}
21. 判断回⽂字符串
代码如下(示例):
#include<string.h>
// 判断字符串
int main()
{
char arr[31] = { 0 };
scanf("%[^\n]s", arr);
int len = strlen(arr);
char* left = arr;
char* right = arr + len - 1;
while (left < right)
{
if (*left != *right)
{
printf("NO");
return 0;
}
left++;
right--;
}
printf("YES");
}
22. 计算天数
代码如下(示例):
// 计算天数
#include <stdio.h>
int get_month_of_day(int y, int m)
{
//将每个⽉份的天数记录在数组中
int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
//获取⽉份的天数
int day = days[m];
//特判⼆⽉天数是29天的情况
if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
{
if (m == 2)
day += 1;
}
return day;
}
int main()
{
int y = 0;
int m = 0;
//输⼊
scanf("%d %d", &y, &m);
//获取y年m⽉的天数
int ret = get_month_of_day(y, m);
printf("%d\n", ret);
return 0;
}
23. 删除指定的数
代码如下(示例):
// 删除指定的数字
//int main()
//{
// int count = 0;
// int arr[10] = { 0 };
// int i = 0;
// int sz = sizeof(arr) / sizeof(arr[0]);
// for (i = 0; i < sz; i++)
// {
// scanf("%d", &arr[i]);
// }
// int n = 0;
// scanf("%d", &n);
// for (i = 0; i < sz; i++)
// {
// if (n == arr[i])
// {
// count++;
// int j = 0;
// for (j = i; j < sz -1; j++)
// {
// arr[j] = arr[j + 1];
// }
// }
// }
// for (i = 0; i < sz-count; i++)
// {
// printf("%d ", arr[i]);
// }
//}
// 方法二
int main()
{
int arr[10] = { 0 };
int del = 0;
int i = 0;
//输⼊
for (i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
scanf("%d", &del);
//删除
int j = 0;
for (i = 0; i < 10; i++)
{
//若当前数与给定值不相同,不需要删除,
//将其填⼊第j个位置,将j后移
if (arr[i] != del)
arr[j++] = arr[i];
}
//打印
for (i = 0; i < j; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
24. 字符串拷贝
代码如下(示例):
// 字符串拷贝--
//int main()
//{
// char arr1[20] = "abcdef";
// char arr2[20] = {0};
// char* str1 = arr1;
// char* str2 = arr2;
// while (*str1 != '\0')
// {
// *str2 = *str1;
// str1++;
// str2++;
// }
// *str2 = '\0';
// printf("%s\n", arr2);
//}
// 方法一
//void my_strcpy(char* dest, const char* src)
//{
// while (*src != '\0') {
// *dest = *src;
// dest++;
// src++;
// }
// // 拷贝原字符串的结束标志
// *dest = '\0';
//}
//int main()
//{
// char arr1[] = "hello bite";
// char arr2[20] = { 0 };
//
// //将字符串arr1中的内容拷⻉到字符串arr2中
// my_strcpy(arr2, arr1);
// //打印字符串arr2
// printf("%s\n", arr2);
// return 0;
//}
// 方法二
void my_strcpy(char* dest, const char* src)
{
while (*dest++ = *src++)
{
;
}
}
int main()
{
char arr1[] = "hello bite";
char arr2[20] = { 0 };
//将字符串arr1中的内容拷⻉到字符串arr2中
my_strcpy(arr2, arr1);
//打印字符串arr2
printf("%s\n", arr2);
return 0;
}
25. 合并有序数组
代码如下(示例):
// 合并有序数组
int main()
{
int n, m;
scanf("%d %d", &n, &m);
int arr1[30] = { 0 };
int arr2[30] = { 0 };
int arr3[60] = { 0 };
int i, j, k = 0; //k最开始没有初始化为0
for (i = 0; i < n; i++)
{
scanf("%d", &arr1[i]);
}
for (j = 0; j < m; j++)
{
scanf("%d", &arr2[j]);
}
i = 0, j = 0;
while (i < n && j < m)
{
if (arr1[i] < arr2[j])
{
arr3[k] = arr1[i];
k++;
i++;
}
else if (arr1[i] > arr2[j])
{
arr3[k] = arr2[j];
k++;
j++;
}
else
{
arr3[k] = arr1[i];
k++;
i++;
}
}
if (i == n)
{
for (; j < m; j++)
{
arr3[k] = arr2[j];
k++;
}
}
if (j == m)
{
for (; i < n; i++)
{
arr3[k] = arr1[i];
k++;
}
}
for (k = 0; k < m + n; k++)
{
printf("%d ", arr3[k]);
}
}
前面25道题整体源代码:
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
// 1. 打印1-100的奇数
//int main()
//{
// int i = 0;
// for (i = 1; i <= 100; i++)
// {
// if (i % 2 == 1)
// printf("%d ", i);
// }
// return 0;
//}
//
//int main()
//{
// int i = 0;
// for (i = 1; i <= 100; i += 2)
// {
// printf("%d ", i);
// }
// return 0;
//}
// 打印9*9乘法表
//int main()
//{
// int i, j;
// for (i = 1; i <= 9; i++)
// {
// for (j = 1; j <= i; j++)
// {
// printf("%d*%d=%2d ", i, j, i * j);
// }
// printf("\n");
// }
//}
// 打印100-200的素数
//int main()
//{
// int i = 0;
// int j = 0;
// for (i = 100; i <= 200; i++)
// {
// int flag = 1;
// for (j = 2; j < i ; j++)
// {
// if (i % j == 0)
// {
// flag = 0;//不是素数
// break;
// }
// }
// if (flag == 1)
// printf("%d ", i);
// }
//}
// 优化版本
//#include<math.h>
//int main()
//{
// int i = 0;
// int j = 0;
// for (i = 101; i < 200; i+=2)
// {
// int flag = 1;
// for (j = 2; j <= sqrt(i); j++)
// {
// if (i % j == 0)
// {
// flag = 0;
// break;
// }
// }
// if (flag == 1)
// printf("%d ", i);
// }
//}
// 判断三角形
//int main()
//{
// int a, b, c;
// scanf("%d %d %d", &a, &b, &c);
// if ((a + b > c && a - b < c) || (b + c > a && b - c < a) || (a + c > b && a - c < b))
// {
// if ((a == b) && (a != c) || (a == c) && (a != b) || (b == c) && (b != a))
// printf("等腰三角形\n");
// else if (a == b && b == c)
// printf("等边三角形\n");
// else
// printf("普通三角形\n");
// }
// else
// {
// printf("非三角形\n");
// }
//}
// 判断三角形
//int main()
//{
// int a, b, c;
// scanf("%d %d %d", &a, &b, &c);
// if (a + b > c && b + c > a && a + c > b)
// {
// if (a == b && b == c)
// printf("等边三角形");
// else if (a == b || a == c || b == c)
// printf("等腰三角形");
// else
// printf("普通三角形");
// }
// else
// {
// printf("非三角形");
// }
//}
// 求最大公约数
//int main()
//{
// int a, b;
// int i = 0;
// scanf("%d %d", &a, &b);
// int c = (a > b ? b : a);
// for (i = c; i >=1; i--)
// {
// if (a % i == 0 && b % i == 0)
// {
// printf("%d\n", i);
// break;
// }
// }
//}
//int main()
//{
// int a, b;
// int i = 0;
// scanf("%d %d", &a, &b);
// int c = (a > b ? b : a);
// while (1)
// {
// if (a % c == 0 && b % c == 0)
// {
// break;
// }
// c--;
// }
// printf("%d\n", c);
// return 0;
//}
//int main()
//{
// int a, b;
// scanf("%d %d", &a, &b);
// int k = 0;
// while (k = a % b)
// {
// a = b;
// b = k;
// }
// printf("%d\n", b);
//}
//
//
////辗转相除法递归实现
//int gcd(int a, int b)
//{
// if (b == 0)
// return a;
// return gcd(b, a % b);
//}
// 求两个数的最小公倍数 方法一
//int main()
//{
// int a = 0;
// int b = 0;
// scanf("%d %d", &a, &b);
// int c = (a > b ? a : b);
// for (int i = c; i < a * b; i++)
// {
// if (i % a == 0 && i % b == 0)
// {
// printf("%d\n", i);
// break;
// }
// }
//}
//求两个数的最小公倍数 方法二
//int main()
//{
// int a = 0;
// int b = 0;
// scanf("%d %d", &a, &b);
// int c = a * b;
// int k = 0;
// // 辗转相除法求最大公约数 b
// while (k = a % b)
// {
// a = b;
// b = k;
// }
// printf("%d\n", c / b);
//}
// error
//int main()
//{
// int i = 1;
// int j = 1;
// for (i = 1; i <= 100; i++)
// {
// if (i % 2 == 0)
// i = i * (-1);
// j = j + 1 / i;
// }
// printf("%d\n", j);
//}
//int main()
//{
// int i = 0;
// double sum = 0;
// for (i = 1; i <= 100; i++)
// {
// if (i % 2 == 1)
// sum += 1.0 / i;
// else
// sum -= 1.0 / i;
// }
// printf("%lf\n", sum);
//}
// 第一种方法
//void bubblesort(int arr[], int sz)
//{
// int i = 0;
// for (i = 0; i < sz - 1; i++)
// {
// int j = 0;
// for (j = 0; j < sz - 1 - i; j++)
// {
// if (arr[j] > arr[j + 1])
// {
// int tmp = arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = tmp;
// }
// }
// }
//}
//int main()
//{
// int arr[10] = { 0 };
// int i = 0;
// for (i = 0; i < 10; i++)
// {
// scanf("%d", &arr[i]);
// }
// int sz = sizeof(arr)/sizeof(arr[0]);
// bubblesort(arr, sz);
// printf("%d\n", arr[9] - arr[0]);
//
//}
// 第二种方法
//int main()
//{
// int arr[10] = { 0 };
// int i = 0;
// for (i = 0; i < 10; i++)
// {
// scanf("%d", &arr[i]);
// }
// int Max = arr[0];
// int Min = arr[0];
// for (i = 1; i < 10; i++)
// {
// if (arr[i] > Max)
// Max = arr[i];
// if (arr[i] < Min)
// Min = arr[i];
// }
// printf("%d\n", Max - Min);
// return 0;
//}
// 第三种方法
//int main()
//{
// int arr;
// scanf("%d", &arr);
// int Max = arr;
// int Min = arr;
// int i = 0;
// for (i = 1; i < 10; i++)
// {
// scanf("%d", &arr);
// if (arr > Max)
// Max = arr;
// if (arr < Min)
// Min = arr;
// }
// printf("%d\n", Max - Min);
// return 0;
//}
// 冒泡排序
//void BubbleSort(int arr[], int sz)
//{
// int i = 0;
// int j = 0;
// for (i = 0; i < sz - 1; i++)
// {
// for (j = 0; j < sz - 1 - i; j++)
// {
// if (arr[j] > arr[j + 1])
// {
// int tmp = arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = tmp;
// }
// }
// }
//}
//void arrPrintf(int arr[], int sz)
//{
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// printf("%d ", arr[i]);
// }
//}
//int main()
//{
// int arr[10] = { 0 };
// int i = 0;
// int sz = sizeof(arr) / sizeof(arr[0]);
// for (i = 0; i < 10; i++)
// {
// scanf("%d", &arr[i]);
// }
// BubbleSort(arr, sz);
// arrPrintf(arr, sz);
//}
//#include <stdio.h>
//int main()
//{
// int arr[10] = { 0 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// scanf("%d", &arr[i]);
// }
// for (i = 0; i < sz - 1; i++)
// {
// int j = 0;
// int flag = 1;//假设待排序的数据已经有序
// for (j = 0; j < sz - 1 - i; j++)
// {
// if (arr[j] > arr[j + 1])
// {
// flag = 0;
// int tmp = arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = tmp;
// }
// }
// if (flag == 1)
// break;
// }
// for (i = 0; i < sz; i++)
// {
// printf("%d ", arr[i]);
// }
// return 0;
//}
//#include <stdio.h>
//int main()
//{
// int arr[10] = { 0 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// scanf("%d", &arr[i]);
// }
// for (i = 0; i < sz - 1; i++)
// {
// int j = 0;
// for (j = 0; j < sz - 1 - i; j++)
// {
// if (arr[j] > arr[j + 1])
// {
// int tmp = arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = tmp;
// }
// }
// }
// for (i = 0; i < sz; i++)
// {
// printf("%d ", arr[i]);
// }
// return 0;
//}
// 判断盗窃者
//int main()
//{
// int thieves = 0;
// for (thieves = 'a'; thieves <= 'd'; thieves++)
// {
// if ((thieves != 'a') + (thieves == 'c') + (thieves == 'd') + (thieves != 'd') == 3)
// printf("盗窃者是: %c", thieves);
// }
//}
// 判断自幂数
//#include <math.h>
//int main()
//{
// int i = 0;
// for (i = 1; i <= 100000; i++)
// {
// //判断i是否是⾃幂数
// //1. 计算i的位数n
// int n = 1;
// int tmp = i;
// while (tmp / 10)
// {
// n++;
// tmp /= 10;
// }
// //2. 计算i的每⼀位的n次⽅之和
// tmp = i;
// int sum = 0;
// while (tmp)
// {
// sum += (int)pow(tmp % 10, n);
// tmp /= 10;
// }
// //3. 输出
// if (sum == i)
// printf("%d ", i);
// }
// return 0;
//}
//int main()
//{
// int n = 0;
// scanf("%d", &n);
// //打印上半部分的n行
// int i = 0;
// for (i = 0; i < n; i++)
// {
// int j = 0;
// for (j = 0; j < n - 1 - i; j++)
// {
// printf(" ");
// }
// for (j = 0; j < 2 * i + 1; j++)
// {
// printf("*");
// }
// printf("\n");
// }
// //打印下半部分的n-1⾏
// for (i = 0; i < n; i++)
// {
// int j = 0;
// for (j = 0; j <= i; j++)
// {
// printf(" ");
// }
// for (j = 0; j < 2 * (n - 1 - i) - 1; j++)
// {
// printf("*");
// }
// printf("\n");
// }
// return 0;
//}
// 喝多少汽水
//int main()
//{
// int n = 0;
// scanf("%d", &n);
// int total = 0;
// int empty = 0;
// total += n;
// empty += n;
// while (empty >= 2)
// {
// total += empty / 2;
// empty = empty / 2 + empty % 2;
// }
// printf("%d\n", total);
//}
// 第二种方法
//int main()
//{
// int n = 0;
// int total = 0;
// scanf("%d", &n);
// if (n == 0)
// total = 0;
// else
// total = 2 * n - 1;
// printf("%d\n",total);
// return 0;
//}
////方法一:不使用库函数
//int main()
//{
// char buf[31] = { 0 };
// scanf("%[^\n]", buf);
// int i = 0;
// while (buf[i])
// {
// if (buf[i] >= 'a' && buf[i] <= 'z')
// buf[i] -= 32;
//
// else if (buf[i] >= 'A' && buf[i] <= 'Z')
// buf[i] += 32;
// i++;
// }
// printf("%s\n", buf);
// return 0;
//}
////⽅法2:使⽤库函数
//#include <ctype.h>
//int main()
//{
// char buf[31] = { 0 };
// scanf("%[^\n]s", buf);
// int i = 0;
// while (buf[i])
// {
// if (islower(buf[i]))
// buf[i] = toupper(buf[i]);
// else if (isupper(buf[i]))
// buf[i] = tolower(buf[i]);
// i++;
// }
// printf("%s\n", buf);
// return 0;
//}
// 交换两个整数
//void Swap(int* pa, int* pb)
//{
// int tmp = *pa;
// *pa = *pb;
// *pb = tmp;
//}
//int main()
//{
// int a, b;
// scanf("%d %d", &a, &b);
// Swap(&a, &b);
// printf("%d %d\n", a, b);
//}
// 求两个整数的平均值
//int average(int a, int b)
//{
// return (a+b)/2;
//}
//int average(int a, int b)
//{
// return a+(b-a)/2;
//}
//int main()
//{
// int a, b;
// scanf("%d %d", &a, &b);
// int ret = average(a, b);
// printf("%d\n", ret);
//}
// 求字符串长度
//模拟实现strlen函数的第一种方法
//#include<assert.h>
//size_t my_first_strlen(const char* string)
//{
// assert(string);
// int count = 0;
// while (*string != '\0')
// {
// string++;
// count++;
// }
// return count;
//}
//int main()
//{
// char arr[10] = "abcdef";
// int ret = my_first_strlen(arr);
// printf("%d\n", ret);
// return 0;
//}
// 第二种方法:递归
//#include<assert.h>
//size_t my_second_strlen(const char* str)
//{
// assert(str != NULL);
// if (*str != '\0')
// {
// return 1 + my_second_strlen(str + 1);
// }
// else
// {
// return 0;
// }
//}
//int main()
//{
// char arr[10] = "abcdef";
// int ret = my_second_strlen(arr);
// printf("%d\n", ret);
// return 0;
//}
// 第三种方法:指针-指针
//#include<assert.h>
//size_t my_third_strlen(const char* str)
//{
// assert(str != NULL);
// const char* start = str;
// while (*str != '\0')
// {
// str++;
// }
// return str - start;
//}
//int main()
//{
// char arr[10] = "abcdef";
// int ret = my_third_strlen(arr);
// printf("%d\n", ret);
// return 0;
//}
//// 逆序字符串
//#include<string.h>
//void reverse(char* arr)
//{
// int ret = strlen(arr);
// char* left = arr;
// char* right = arr + ret - 1;
// while (left < right)
// {
// char tmp = *left;
// *left = *right;
// *right = tmp;
// left++;
// right--;
// }
//}
//int main()
//{
// char arr[31] = { 0 };
// scanf("%[^\n]", arr);
// reverse(arr);
// printf("%s\n", arr);
//}
//// 方法二
//int digit_sum(int m)
//{
// int sum = 0;
// while (m)
// {
// sum += m % 10;
// m /= 10;
// }
// //返回每⼀位的和
// return sum;
//}
//// 求数字的每一位之和
//// 方法一
//int main()
//{
// int n = 0;
// scanf("%d", &n);
// int sum = 0;
// while (n / 10)
// {
// sum += n % 10;
// n /= 10;
// }
// sum += n % 10;
// printf("%d\n", sum);
//}
//#include<string.h>
//// 判断字符串
//int main()
//{
// char arr[31] = { 0 };
// scanf("%[^\n]s", arr);
// int len = strlen(arr);
// char* left = arr;
// char* right = arr + len - 1;
// while (left < right)
// {
// if (*left != *right)
// {
// printf("NO");
// return 0;
// }
// left++;
// right--;
// }
// printf("YES");
//}
//// 计算天数
//#include <stdio.h>
//int get_month_of_day(int y, int m)
//{
// //将每个⽉份的天数记录在数组中
// int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
//
// //获取⽉份的天数
// int day = days[m];
//
// //特判⼆⽉天数是29天的情况
// if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
// {
// if (m == 2)
// day += 1;
// }
// return day;
//}
//int main()
//{
// int y = 0;
// int m = 0;
// //输⼊
// scanf("%d %d", &y, &m);
// //获取y年m⽉的天数
// int ret = get_month_of_day(y, m);
// printf("%d\n", ret);
// return 0;
//}
// 删除指定的数字 err样例
//int main()
//{
// int arr[10] = { 0 };
// int i = 0;
// for (i = 0; i<sizeof(arr) / sizeof(arr[0]); i++)
// {
// scanf("%d", &arr[i]);
// }
// int n = 0;
// scanf("%d", &n);
// for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
// {
// if (n == arr[i])
// arr[i] = arr[i + 1];
// }
// for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
// {
// printf("%d ", arr[i]);
// }
//}
// 删除指定的数字
//int main()
//{
// int count = 0;
// int arr[10] = { 0 };
// int i = 0;
// int sz = sizeof(arr) / sizeof(arr[0]);
// for (i = 0; i < sz; i++)
// {
// scanf("%d", &arr[i]);
// }
// int n = 0;
// scanf("%d", &n);
// for (i = 0; i < sz; i++)
// {
// if (n == arr[i])
// {
// count++;
// int j = 0;
// for (j = i; j < sz -1; j++)
// {
// arr[j] = arr[j + 1];
// }
// }
// }
// for (i = 0; i < sz-count; i++)
// {
// printf("%d ", arr[i]);
// }
//}
// 方法二
//int main()
//{
// int arr[10] = { 0 };
// int del = 0;
// int i = 0;
// //输⼊
// for (i = 0; i < 10; i++)
// {
// scanf("%d", &arr[i]);
// }
// scanf("%d", &del);
//
// //删除
// int j = 0;
// for (i = 0; i < 10; i++)
// {
// //若当前数与给定值不相同,不需要删除,
// //将其填⼊第j个位置,将j后移
// if (arr[i] != del)
// arr[j++] = arr[i];
// }
//
// //打印
// for (i = 0; i < j; i++)
// {
// printf("%d ", arr[i]);
// }
// return 0;
//}
// 字符串拷贝--
//int main()
//{
// char arr1[20] = "abcdef";
// char arr2[20] = {0};
// char* str1 = arr1;
// char* str2 = arr2;
// while (*str1 != '\0')
// {
// *str2 = *str1;
// str1++;
// str2++;
// }
// *str2 = '\0';
// printf("%s\n", arr2);
//}
// 方法一
//void my_strcpy(char* dest, const char* src)
//{
// while (*src != '\0') {
// *dest = *src;
// dest++;
// src++;
// }
// // 拷贝原字符串的结束标志
// *dest = '\0';
//}
//int main()
//{
// char arr1[] = "hello bite";
// char arr2[20] = { 0 };
//
// //将字符串arr1中的内容拷⻉到字符串arr2中
// my_strcpy(arr2, arr1);
// //打印字符串arr2
// printf("%s\n", arr2);
// return 0;
//}
// 方法二
//void my_strcpy(char* dest, const char* src)
//{
// while (*dest++ = *src++)
// {
// ;
// }
//}
//int main()
//{
// char arr1[] = "hello bite";
// char arr2[20] = { 0 };
//
// //将字符串arr1中的内容拷⻉到字符串arr2中
// my_strcpy(arr2, arr1);
// //打印字符串arr2
// printf("%s\n", arr2);
// return 0;
//}
//// 合并有序数组
//int main()
//{
// int n, m;
// scanf("%d %d", &n, &m);
// int arr1[30] = { 0 };
// int arr2[30] = { 0 };
// int arr3[60] = { 0 };
// int i, j, k = 0; //k最开始没有初始化为0
// for (i = 0; i < n; i++)
// {
// scanf("%d", &arr1[i]);
// }
// for (j = 0; j < m; j++)
// {
// scanf("%d", &arr2[j]);
// }
// i = 0, j = 0;
// while (i < n && j < m)
// {
// if (arr1[i] < arr2[j])
// {
// arr3[k] = arr1[i];
// k++;
// i++;
// }
// else if (arr1[i] > arr2[j])
// {
// arr3[k] = arr2[j];
// k++;
// j++;
// }
// else
// {
// arr3[k] = arr1[i];
// k++;
// i++;
// }
// }
// if (i == n)
// {
// for (; j < m; j++)
// {
// arr3[k] = arr2[j];
// k++;
// }
// }
// if (j == m)
// {
// for (; i < n; i++)
// {
// arr3[k] = arr1[i];
// k++;
// }
// }
// for (k = 0; k < m + n; k++)
// {
// printf("%d ", arr3[k]);
// }
//}
后面75道题都是在线OJ环境下编写算法
26. 两整数相加 - 题号2235
27. 猜数字 - 题号LCP 01
代码如下(示例):
int game(int* guess, int guessSize, int* answer, int answerSize)
{
int i = 0;
int cnt = 0;
for (i = 0; i < guessSize; i++)
{
if (guess[i] == answer[i]) {
cnt++;
}
}
return cnt;
}
代码如下(示例):
int sum(int num1, int num2)
{
return num1+num2;
}
28. 温度转换 - 题号2469
代码如下(示例):
double* convertTemperature(double celsius, int* returnSize)
{
double* str = (double*)malloc(2*sizeof(double));
str[0]=celsius+273.15;
str[1]=celsius*1.80+32.00;
*returnSize = 2;
return str;
}
29. 最⼩偶倍数 - 题号 2413
代码如下(示例):
int smallestEvenMultiple(int n) {
//判断n是不是偶数
if (n % 2 == 0)
return n;
//如果不是偶数,则⼀定是奇数
else
return 2 * n;
}
int smallestEvenMultiple(int n) {
//判断n是不是偶数
if (n & 1 == 0)
return n;
//如果没有进⾏上⼀步操作,直接返回n为奇数时的结果2*n即可
return 2 * n;
}
30. 数组异或操作 - 题号1486
代码如下(示例):
int xorOperation(int n, int start)
{
int arr[n];
int i = 0;
for (i = 0; i < n; i++)
{
arr[i] = start + 2 * i;
}
int ret = 0;
for (i = 0; i < n; i++)
{
ret ^= arr[i];
}
return ret;
}
int xorOperation(int n, int start) {
int i = 0;
int ret = 0;
int u;
for (i = 0; i < n; i++) {
//将nums[i]的值存放在u中,每次更新u的值
u = start + 2 * i;
ret ^= u;
}
return ret;
}
31. 数组元素和与数字和的绝对差
代码如下(示例):
#include<math.h>
int differenceOfSum(int* nums, int numsSize)
{
int x = 0;
int y = 0;
for (int i = 0; i < numsSize; i++)
{
x += nums[i];
while (nums[i])
{
y += nums[i] % 10;
nums[i] /= 10;
}
}
return abs(x - y);
}
32. 回⽂数 - 题号:9
代码如下(示例):
bool isPalindrome(int x)
{
if (x < 0)
{
return false;
}
long long n = 0;
int tmp = x;
while (tmp)
{
n = n * 10 + tmp % 10;
tmp /= 10;
}
return x == n;
}
33. 有多少⼩于当前数字的数字
这里用方法一是最优解,方法二和三适合教学,代码如下!
代码如下(示例):
// 方法一:
#include<stdlib.h>
int* smallerNumbersThanCurrent(int* nums, int numsSize, int* returnSize)
{
int* tmp = (int*)malloc(numsSize * sizeof(int));
for (int i = 0; i < numsSize; i++)
{
int count = 0;
for (int j = 0; j < numsSize; j++)
{
if (nums[i] > nums[j])
{
count++;
}
}
tmp[i] = count;
}
*returnSize = numsSize;
return tmp;
}
// 方法二
int low(int* order, int orderSize, int u) {
int i;
//定义左右两边界,l为最左边,r为最右边
int l = 0, r = orderSize - 1;
//当l<r时表⽰l~r之间还未被查找
while (l < r) {
//mid为l和r的中点,向下取整
int mid = (l + r) / 2;
//如果在有序数组中下标为中点的数⼩于要查找的数,则要查找的数⼀定在中点右边,将左边界修改为中
if (order[mid] < u) l = mid + 1;
//否则在中点处或者中点左边部分,将右边界修改为中点,
else r = mid;
}
//当查找完成时l=r,返回其中⼀个即可
return l;
}
int* smallerNumbersThanCurrent(int* nums, int numsSize, int* returnSize) {
//定义答案数组
int* ans = malloc(numsSize * sizeof(int));
//定义有序数组
int* order = malloc(numsSize * sizeof(int));
int i = 0, j = 0;
//将原数组中的数放⼊有序数组,之后进⾏排序
for (i = 0; i < numsSize; i++) order[i] = nums[i];
//此段代码为冒泡排序,时间复杂度较⾼,有兴趣可以修改此段代码为其他时间复杂度较低的排序代
for (i = 0; i < numsSize; i++) {
//此层循环为将当前数组最⼤值(除了之前已经找到的最⼤值之外)放⼊数组最后⾯(nunmsS
for (j = 0; j < numsSize - i - 1; j++) {
//如果两个相邻的数之间左边的⽐较⼤,则交换相邻的两个数
if (order[j] > order[j + 1]) {
int u = order[j];
order[j] = order[j + 1];
order[j + 1] = u;
}
}
}
//更新答案数组
for (int i = 0; i < numsSize; i++) {
//将当前数在有序数组中的下标存⼊答案数组,order:有序数组,numsSize:数组⻓度,nums[
ans[i] = low(order, numsSize, nums[i]);
}
//更新数组⻓度并返回数组
*returnSize = numsSize;
return ans;
}
// 方法三:
int* smallerNumbersThanCurrent(int* nums, int numsSize, int* returnSize) {
//定义答案数组,排序数组,哈希表数组
int* ans = malloc(numsSize * sizeof(int));
int* order = malloc(numsSize * sizeof(int));
int* bucket = malloc(110 * sizeof(int));
int i = 0, j = 0;
//初始化哈希表数组中的值为-1
//防⽌出现重复情况,哈希表⼀个下标放⼊多个值,仅当桶⾥值为-1时更新桶⾥的值
for (i = 0; i < 101; i++) bucket[i] = -1;
//将原数组中的值放⼊排序数组
for (i = 0; i < numsSize; i++) order[i] = nums[i];
//此段代码为冒泡排序,时间复杂度较⾼,有兴趣可以修改此段代码为其他排序代码,内容同上
for (i = 0; i < numsSize; i++) {
for (j = 0; j < numsSize - i - 1; j++) {
if (order[j] > order[j + 1]) {
int u = order[j];
order[j] = order[j + 1];
order[j + 1] = u;
}
}
}
//定义变量cnt记录当前数是否重复出现,若第⼀次出现则记录当前位置,使得之后的重复的数都被赋值
int cnt = 0;
for (i = 0; i < numsSize; i++) {
//若第⼀次出现,则更新cnt
if (bucket[order[i]] == -1) cnt = i;
//将当前数第⼀次出现的位置放⼊桶⾥
bucket[order[i]] = cnt;
}
//遍历原数组,将数字在桶⾥的值放⼊答案数组
for (i = 0; i < numsSize; i++) {
ans[i] = bucket[nums[i]];
}
//更新数组⻓度并返回答案数组
*returnSize = numsSize;
return ans;
}
34. 字⺟在字符串中的百分⽐
代码如下(示例):
int percentageLetter(char* s, char letter)
{
int sum = 0;
int ret = strlen(s);
while (*s)
{
if (*s == letter)
{
sum++;
}
s++;
}
return sum * 100 / ret;
}
35. ⾯试题 01.01. 判定字符是否唯⼀
代码如下(示例):
bool isUnique(char* astr) {
int i = 0;
//定义数组⽤来标记每个字⺟是否出现,0为未出现过,1为已经出现过
bool hash[26] = { 0 };
//遍历字符串,当字符不为空时进⼊循环
while (astr[i]) {
//若当前字⺟之前被标记过返回false
if (hash[astr[i] - 'a'] == 1)
return false;
//否则标记当前字⺟
else
hash[astr[i] - 'a'] = 1;
//下标+1,继续遍历下⼀个字符
i++;
}
//遍历结束,未出现重复,则返回true
return true;
}
bool isUnique(char* astr) {
int i = 0;
//定义变量⽤来标记
int s = 0;
while (astr[i]) {
//在这⾥定义u直接表⽰为左移后的结果
//astr[i]-'a'即为astr[i]在字⺟表中的顺序-1,即上⾯所说的w-1
int u = 1 << (int)(astr[i] - 'a');
//若未被标记则标记此位,即s加上u;
if ((u & s) == 0) s += u;
//若之前已经被标记,则返回false;
else return false;
i++;
}
//遍历结束不存在重复则返回true
return true;
}
36. IP 地址⽆效化 - 题号:1108
代码如下(示例):
char* defangIPaddr(char* address)
{
int len = strlen(address);
char* ptr = NULL;
char* ans = ptr = malloc(len + 6 + 1);
while (*address)
{
if (*address == '.')
{
*ptr = '[';
ptr++;
*ptr = '.';
ptr++;
*ptr = ']';
ptr++;
}
else
{
*ptr++ = *address;
}
address++;
}
*ptr = '\0';
return ans;
}
37. 句⼦中的最多单词数
代码如下(示例):
int mostWordsFound(char** sentences, int sentencesSize)
{
int i = 0;
int max = 0;
for (i = 0; i < sentencesSize; i++)
{
int word = 1;
int j = 0;
while (sentences[i][j])
{
if (sentences[i][j] == ' ')
{
word++;
}
j++;
}
if (max < word)
{
max = word;
}
}
return max;
}
38. 反转两次的数字 - 题号:2119
)
代码如下(示例):
bool isSameAfterReversals(int num)
{
int tmp = num;
long long n = 0;
while (tmp)
{
n = n * 10 + tmp % 10;
tmp /= 10;
}
while (n)
{
tmp = tmp * 10 + n % 10;
n /= 10;
}
if (tmp == num)
{
return true;
}
else
{
return false;
}
}
bool isSameAfterReversals(int num)
{
int tmp = num;
int n = 0;
while (tmp)
{
n = n * 10 + tmp % 10;
tmp /= 10;
}
while (n)
{
tmp = tmp * 10 + n % 10;
n /= 10;
}
return num == tmp;
}
// 方法二:只要num个位数不为0,返回正确
bool isSameAfterReversals(int num)
{
return num == 0 || num % 10 != 0;
}
39. 找出数组的最⼤公约数-题号:1979
代码如下(示例):
int findGCD(int* nums, int numsSize)
{
int i = 0;
for (i = 0; i < numsSize - 1; i++)
{
for (int j = 0; j < numsSize - 1 - i; j++)
{
if (nums[j] < nums[j + 1])
{
int tmp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = tmp;
}
}
}
int a = nums[0];
int b = nums[numsSize - 1];
int c = (a > b ? b : a);
while (1)
{
if (a % c == 0 && b % c == 0)
{
break;
}
c--;
}
return c;
}
40. 统计位数为偶数的数字-题号:1295
代码如下(示例):
int findNumbers(int* nums, int numsSize)
{
int sum = 0;
int i = 0;
for (i = 0; i < numsSize; i++)
{
int ret = nums[i];
int tmp = 0;
while (ret)
{
tmp++;
ret = ret / 10;
}
if (tmp % 2 == 0)
{
sum++;
}
}
return sum;
}
#include<string.h>
int findNumbers(int* nums, int numsSize)
{
int i = 0;
int ans = 0;
//定义字符串数组⽤来存放转化后的字符串
char arr[7] = {};
for (i = 0; i < numsSize; i++) {
//将数字转化为字符串
sprintf(arr, "%d", nums[i]);
//字符串⻓度为偶数,即当前数字位数为偶数时记录⼀次
if (strlen(arr) % 2 == 0) {
ans++;
}
}
//返回位数为偶数的数字个数
return ans;
}
41. 分割数组中数字的数位-题号:2553
代码如下(示例):
int* separateDigits(int* nums, int numsSize, int* returnSize)
{
int i = 0;
int tmp = 0;
//定义数组作为返回值并且分配内存
int* ans = malloc(6 * 1000 * sizeof(int));
int k = 0;
for (i = 0; i < numsSize; i++)
{
int n = nums[i];
int j = 0;
//反转n放⼊tmp
while (n)
{
tmp = tmp * 10 + n % 10;
n /= 10;
}
//正向存储到ans
while (tmp)
{
ans[k++] = tmp % 10;
tmp /= 10;
}
}
*returnSize = k;
return ans;
}
但这样的方法有弊端,因为 80 逆转 之后就是 8 了,没发计算 0 和 8
所以可以采用以下的方法进行运算,使用三个函数进行封装
代码如下(示例):
{
int length = 0;
while (num != 0)
{
length++;
num /= 10;
}
return length;
}
void reverse(int* answer, int start, int end)
{
for (int i = start, j = end; i < j; i++, j--)
{
int temp = answer[i];
answer[i] = answer[j];
answer[j] = temp;
}
}
int* separateDigits(int* nums, int numsSize, int* returnSize)
{
int totalLength = 0;
for (int i = 0; i < numsSize; i++)
{
totalLength += getLength(nums[i]);
}
int* answer = (int*)malloc(sizeof(int) * totalLength);
*returnSize = totalLength;
int index = 0;
for (int i = 0; i < numsSize; i++)
{
int start = index;
int temp = nums[i];
while (temp != 0)
{
answer[index] = temp % 10;
index++;
temp /= 10;
}
reverse(answer, start, index - 1);
}
return answer;
}
42. 速算机器⼈-题号:LCP17
代码如下(示例):
int calculate(char* s)
{
//定义x和y并初始化
int x = 1;
int y = 0;
//遍历字符串数组,字符串数组指针直接指向字符串⾸位,则遍历时直接获取指针指向的字符,判断
while (*s)
{
//判断当前字符,并执⾏相应操作
if (*s == 'A')
x = 2 * x + y;
else if (*s == 'B')
y = 2 * y + x;
//字符串指针后移,完成遍历操作
s++;
}
//返回操作执⾏完成后的两值之和
return x + y;
}
43. 转换成⼩写字⺟-题号:709
代码如下(示例):
char* toLowerCase(char* s)
{
int i = 0;
while (s[i])
{
if (s[i] >= 'A' && s[i] <= 'Z')
{
s[i] += 32;
}
i++;
}
return s;
}
44. 找出中枢整数-题号:2485
代码如下(示例):
int pivotInteger(int n)
{
int i;
//遍历1~n
for (i = 1; i <= n; i++)
{
//若i满⾜1~i的和与i~n的和相等,则返回i
if ((1 + i) * i / 2 == (i + n) * (n - i + 1) / 2)
return i;
}
//当1~n都不能满⾜题意时,返回-1
return -1;
}
45. 公因⼦的数⽬-题号:2427
代码如下(示例):
int commonFactors(int a, int b)
{
int c = a > b ? b : a;
int i = 0;
int sum = 0;
for (i = 1; i <= c; i++)
{
if (a % i == 0 && b % i == 0)
{
sum++;
}
}
return sum;
}
46. 执⾏操作后的变量值-题号:2011
代码如下(示例):
int finalValueAfterOperations(char** operations, int operationsSize)
{
int i;
//定义变量并初始化
int x = 0;
//遍历操作数组
for (i = 0; i < operationsSize; i++)
{
//使⽤strcmp函数对字符串进⾏⽐较,若字符串是"X++"或"++X"其中之⼀,则进⾏x++操作
if (!strcmp(operations[i], "X++") || !strcmp(operations[i], "++X"))
{
x++;
}
//否则进⾏x--操作
else
{
x--;
}
//另⼀种写法:
/*
if(operations[i][1]=='+') x++;
else x--;
*/
}
//返回最终值
return x;
}
47. 设计停车系统-题号:1603
代码如下(示例):
typedef struct
{
int parking[3];
}ParkingSystem;
// 初始化停车场系统
ParkingSystem* parkingSystemCreate(int big, int medium, int small)
{
// 为停车场系统指针分配内存
ParkingSystem* obj = (ParkingSystem*)malloc(sizeof(ParkingSystem));
// 分别将三个函数参数赋值给停车场系统的停车位数量
obj->parking[0] = big;
obj->parking[1] = medium;
obj->parking[2] = small;
// 返回停车场系统指针
return obj;
}
// 添加车辆
bool parkingSystemAddCar(ParkingSystem* obj, int carType)
{
// 如果相应的停车位数量为0,则添加失败
if (obj->parking[carType - 1] == 0)
{
return false;
}
// 否则添加成功,相应停车位数量减⼀
else
{
obj->parking[carType - 1]--;
return true;
}
}
// 释放停车场系统内存
void parkingSystemFree(ParkingSystem* obj)
{
free(obj);
}
48. 翻转图像-题号:832
代码如下(示例):
int** flipAndInvertImage(int** image, int imageSize, int* imageColSize,
int* returnSize, int** returnColumnSizes)
{
int i = 0;
int j = 0;
// ⽔平翻转
for (i = 0; i < imageSize; i++) {
int l = 0;
int r = imageSize - 1;
// 逆序当前⾏,当l=r时不需要交换
while (l < r) {
// 交换
int tmp = image[i][l];
image[i][l] = image[i][r];
image[i][r] = tmp;
// 左指针右移,右指针左移,交换下⼀组
l++;
r--;
}
}
// 遍历数组所有位置进⾏反转
for (i = 0; i < imageSize; i++) {
for (j = 0; j < imageSize; j++) {
// ⽤1减去当前值即可完成反转
image[i][j] = 1 - image[i][j];
}
}
// 另⼀种写法,在逆序时直接反转,⽆实际复杂度优化,只是提⾼代码复⽤率
/*
for(i=0; i<imageSize; i++) {
int l = 0;
int r = imageSize-1;
//逆序当前⾏,当l=r时不需要交换
while(l<r) {
//交换
int tmp = image[i][l];
image[i][l] = image[i][r];
image[i][r] = tmp;
//反转
image[i][l]=1-image[i][l];
image[i][r]=1-image[i][r];
l++;r--;
}
//当l=r时不需要交换,但是需要反转
if(l==r) image[i][l]=1-image[i][l];
}
*/
// 参数的解释很重要,数组的⾏列长度都未发⽣变化,直接赋值为原数组长度
*returnSize = imageSize;
*returnColumnSizes = imageColSize;
// 返回操作完成后的数组
return image;
}
49. 链表中倒数第k个节点-题号:剑指offer22
代码如下(示例):
struct ListNode* trainingPlan(struct ListNode* head, int cnt)
{
if (head == NULL)
{
return NULL;
}
struct ListNode* n2 = head;
struct ListNode* n1 = head;
int i = 0;
for (i = 0; i < cnt; i++)
{
if (n2->next != NULL)
{
n2 = n2->next;
}
else
{
return n1;
break;
}
}
while (n2 != NULL)
{
n1 = n1->next;
n2 = n2->next;
}
return n1;
}
50. ⼆进制链表转整数-题号:1290
代码如下(示例):
int getDecimalValue(struct ListNode* head)
{
int ret = 0;
// 定义链表指针⽤作遍历整个链表
struct ListNode* cur = head;
// 链表指针不为空时进⼊循环
while (cur)
{
// 左移⼀位后将当前值添加⾄最低位
ret = (ret << 1) + cur->val;
// 因为左移操作后最低位为0,任何数与0进⾏或操作都是不变的所以上式也可以写为
// ret = (ret << 1) | cur->val;
// 指针只想下⼀位数字或者链表结尾
cur = cur->next;
}
// 返回最终得到的数字
return ret;
}
51. 矩阵对角元素的和-题号:1572
代码如下(示例):
int diagonalSum(int** mat, int matSize, int* matColSize)
{
int i = 0;
// 定义变量存储答案
int sum = 0;
// 循环遍历数组
for (i = 0; i < matSize; i++)
{
int j = 0;
for (j = 0; j < matSize; j++)
{
// 判断当前数是否在对⻆线上
if (i == j || i + j == matSize - 1)
{
// 若在对⻆线上则将其添加⾄答案中
sum += mat[i][j];
}
}
}
// 返回答案
return sum;
}
52. 汉明距离-题号:461
代码如下(示例):
int hammingDistance(int x, int y)
{
int r = x^y;
int ret = 0;
while(r)
{
ret++;
r = r&(r-1);
}
return ret;
}
53. 只出现⼀次的数字Ⅲ-题号:260
代码如下(示例):
int* singleNumber(int* nums, int numsSize, int* returnSize)
{
int* ans = (int*)calloc(2, sizeof(int));
int ret = 0;
int i = 0;
// 计算数组中所有数异或起来的结果ret
for (i = 0; i < numsSize; i++)
{
ret ^= nums[i];
}
// 从低位往⾼位遍历计算ret的⼆进制中哪⼀位是1
int pos = 0;
for (i = 0; i < 32; i++)
{
if (((ret >> i) & 1) == 1)
{
pos = i;
break;
}
}
// 3. 分组异或
for (i = 0; i < numsSize; i++)
{
// 若当前数pos位为1,作为其中⼀组对ans[0]进⾏异或操作
if (((nums[i] >> pos) & 1) == 1)
{
ans[0] ^= nums[i];
}
// 否则,作为另⼀组对ans[1]进⾏异或操作。
else
{
ans[1] ^= nums[i];
}
}
// ans[1]另⼀种计算⽅法
// ans[1]=ret^ans[0];
// 更新数组长度
*returnSize = 2;
// 返回答案数组
return ans;
}
54. 颠倒⼆进制位-题号:190
代码如下(示例):
uint32_t reverseBits(uint32_t n)
{
int i = 0;
// 定义⼀个⽆符号整型ans
uint32_t ans = 0;
// 从低位往⾼位遍历,当i
for (i = 1; i <= 32; i++)
{
// 将原数的第i+1位赋值给ans的第32-(i+1)+1位
ans |= ((n >> (i - 1)) & 1) << (31 - i + 1);
}
// 返回答案
return ans;
}
55. 检查两个字符串数组是否相等-题号:1662
代码如下(示例):
bool arrayStringsAreEqual(char** word1, int word1Size, char** word2, int word2Size)
{
int i = 0;
char name1[1001] = { 0 };
char name2[1001] = { 0 };
for (i = 0; i < word1Size; i++)
{
strcat(name1, word1[i]);
}
for (i = 0; i < word2Size; i++)
{
strcat(name2, word2[i]);
}
return (strcmp(name1, name2) == 0);
}
bool arrayStringsAreEqual(char** word1, int word1Size, char** word2, int word2Size)
{
//定义指向字符串数组的指针指向数组起始位置,并定义两个变量指向两个字符串的字符位置
int x = 0, y = 0, i = 0, j = 0;
//同时遍历两个字符串数组
while (x < word1Size && y < word2Size)
{
//⽐较当前指向的两个字符是否相等
if (word1[x][i] != word2[y][j])
{
//不相等直接返回false
return false;
}
//指向字符的变量后移
i++;
//如果指针当前指向空,则遍历下⼀个字符串,并且重新初始化字符指针
if (word1[x][i] == '\0')
{
x++;
i = 0;
}
//同上
j++;
if (word2[y][j] == '\0')
{
y++;
j = 0;
}
}
//若两个字符串遍历同时结束并未发现不相同字符时返回true,否则返回false
return x == word1Size && y == word2Size;
}
56. 按⾝⾼排序-题号:2418
代码如下(示例):
char** sortPeople(char** names, int namesSize, int* heights, int heightsSize, int* returnSize)
{
// 冒泡排序排两个数组
int i = 0;
for (i = 0; i < heightsSize - 1; i++)
{
int j = 0;
for (j = 0; j < heightsSize - 1 - i; j++)
{
if (heights[j] < heights[j + 1])
{
int tmp = heights[j];
heights[j] = heights[j + 1];
heights[j + 1] = tmp;
char* name = NULL;
name = names[j];
names[j] = names[j + 1];
names[j + 1] = name;
}
}
}
*returnSize = heightsSize;
return names;
}
57. 删除每⾏中的最⼤值-题号:2500
代码如下(示例):
//定义qsort函数中的排序参数
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
int deleteGreatestValue(int** grid, int gridSize, int* gridColSize)
{
int i = 0;
int ans = 0;
//先对数组每⼀⾏排序,从⼩到⼤和从⼤到⼩都可以,只需保证每次删除的数在同⼀列即可
for (i = 0; i < gridSize; i++)
{
qsort(grid[i], *gridColSize, sizeof(int), cmp_int);
}
int j = 0;
//定义变量,初始化为最⼤列下标
int y = *gridColSize - 1;
//求出数组最后⼀列的最⼤值,加到ans上,然后y--,遍历每⼀列
while (y >= 0)
{
int max = grid[0][y];
//求当前列的最⼤值
for (j = 1; j < gridSize; j++)
{
if (max < grid[j][y])
{
max = grid[j][y];
}
}
//将最⼤值添加⾄ans
ans += max;
y--;
}
//返回答案
return ans;
}
58. 最富有客⼾的资产总量-题号:1672
代码如下(示例):
int maximumWealth(int** accounts, int accountsSize, int* accountsColSize)
{
int max = 0;
int i = 0;
for (i = 0; i < accountsSize; i++)
{
int j = 0;
int tmp = 0;
for (j = 0; j < *accountsColSize; j++)
{
int max = accounts[0][0];
tmp += accounts[i][j];
}
if (max < tmp)
{
max = tmp;
}
}
return max;
}
59. 统计能整除数字的位数-题号:2520
代码如下(示例):
int countDigits(int num)
{
int cnt = 0;
int tmp = num;
while(tmp)
{
if(num % (tmp % 10) == 0)
{
cnt++;
}
tmp = tmp/10;
}
return cnt;
}
60. 重新排列数组-题号:1470
代码如下(示例):
int* shuffle(int* nums, int numsSize, int n, int* returnSize)
{
int i = 0;
int* ret = (int*)malloc(2 * n * sizeof(int));
for (i = 0; i < n; i++)
{
ret[2 * i] = nums[i];
ret[2 * i + 1] = nums[i + n];
}
*returnSize = 2 * n;
return ret;
}
61. 矩阵中的局部最⼤值-题号:2373
代码如下(示例):
int Max(int x, int y) { return x > y ? x : y; }
int** largestLocal(int** grid, int gridSize, int* gridColSize, int* returnSize,
int** returnColumnSizes)
{
// 使⽤malloc模拟开辟⼀个⼆维数组
int** ans = malloc((gridSize - 2) * sizeof(int*));
int i = 0;
// 为每个⼀维数组开辟空间
for (i = 0; i < gridSize - 2; i++) {
ans[i] = malloc((gridSize - 2) * sizeof(int));
}
// 遍历数组并忽略⽆法取得3×3矩阵的情况
for (i = 0; i < gridSize - 2; i++) {
int j = 0;
for (j = 0; j < gridSize - 2; j++) {
int x = 0;
int y = 0;
// 求得最⼤值,并将其赋值给ans数组相对应下标的元素
for (x = i; x <= i + 2; x++) {
for (y = j; y <= j + 2; y++) {
ans[i][j] = Max(ans[i][j], grid[x][y]);
}
}
}
}
// 更新数组长度
*returnSize = gridSize - 2;
// 更新数组每⼀维长度
*returnColumnSizes = malloc((gridSize - 2) * sizeof(int));
for (i = 0; i < gridSize - 2; i++) {
(*returnColumnSizes)[i] = gridSize - 2;
}
// 返回⽣成的矩阵
return ans;
}
}
62. 判断句⼦是否为全字⺟句-题号:1832
代码如下(示例):
bool checkIfPangram(char* sentence)
{
// ⽤于记录字⺟表中每个字⺟是否在sentence中出现过,初始化为0
int exist[26] = { 0 };
int i = 0;
// 遍历sentence中的每个字符
while (*sentence)
{
// 将对应字⺟表中的字⺟在exist数组中的值设为1
exist[*sentence - 'a'] = 1;
sentence++;
}
// 遍历exist数组
for (i = 0; i < 26; i++)
{
// 如果存在某个字⺟在sentence中未出现,则返回false
if (exist[i] == 0)
return false;
}
// sentence为全字⺟句,返回true
return true;
}
63. 宝⽯与⽯头-题号:771
代码如下(示例):
int numJewelsInStones(char* jewels, char* stones)
{
int sum = 0;
while (*jewels)
{
char* tmp = stones;
while (*tmp)
{
if (*jewels == *tmp)
{
sum++;
}
tmp++;
}
jewels++;
}
return sum;
}
int numJewelsInStones(char* jewels, char* stones)
{
int n = 0;
//定义⼀个哈希数组,将英⽂字⺟映射到ASCII码表中,其最⼤值和最⼩值之差为57。
bool hash[60] = { 0 };
//遍历jewels
while (*jewels)
{
//标记jewels中出现的字符
hash[*jewels - 'A'] = 1;
jewels++;
}
//遍历stones
while (*stones)
{
//判断当前字符是否被标记过
if (hash[*stones - 'A'])
n++;
stones++;
}
//返回答案
return n;
}
64. 交替数字和-题号:2544
代码如下(示例):
// 假设成立时候,flag = -1,返回sum
// 假设不成立时,flag = 1 ,返回-sum
int alternateDigitSum(int n)
{
int flag = 1;
int sum = 0;
while (n)
{
sum += flag * (n % 10);
flag = -flag;
n = n / 10;
}
return -flag * sum;
}
65. 找到最⾼海拔-题号:1732
代码如下(示例):
int largestAltitude(int* gain, int gainSize)
{
int i = 0;
//定义⼀个变量m记录最⾼海拔,并初始化为第⼀个点的海拔
int m = gain[0];
for (i = 1; i < gainSize; i++)
{
//更新gain数组当前元素为当前的前缀和
gain[i] += gain[i - 1];
//更新m为当前最⼤海拔
if (gain[i] > m)
{
m = gain[i];
}
}
//特判若所有点的海拔都低于初始值,则更新m为0
if (m < 0)
{
m = 0;
}
//返回最⾼海拔
return m;
}
66. 整数的各位积和之差-题号:1281
代码如下(示例):
int subtractProductAndSum(int n)
{
int sum1 = 0;
int sum2 = 1;
while (n)
{
sum1 += (n % 10);
sum2 *= (n % 10);
n = n / 10;
}
return sum2 - sum1;
}
67. 统计⼀致字符串的数⽬ - 题号:1684
代码如下(示例):
int countConsistentStrings(char* allowed, char** words, int wordsSize) {
int i = 0;
int count = 0;
//遍历words数组
for (i = 0; i < wordsSize; i++) {
int j = 0;
//假定全部出现
int flag = 1;
//遍历每⼀个字符
while (words[i][j]) {
if (NULL == strchr(allowed, words[i][j])) {
//有字符没出现
flag = 0;
break;
}
j++;
}
//更新计数器的值
count += flag;
}
//返回计数器的值
return count;
}
68. 左旋转字符串 - 题号:剑指 Offer 58 - Ⅱ
代码如下(示例):
char* dynamicPassword(char* password, int target)
{
int i = 0;
int len = strlen(password);
for (i = 0; i < target; i++)
{
char tmp = password[0];
int j = 0;
for (j = 0; j < len - 1; j++)
{
password[j] = password[j + 1];
}
password[len - 1] = tmp;
}
return password;
}
void reverse(char* left, char* right)
{
//反转两个指针之间的内容
while (left < right)
{
//交换两个指针指向的的内容
char tmp = *left;
*left = *right;
*right = tmp;
//两个指针向对⽅靠拢,继续进⾏交换
left++;
right--;
}
}
char* reverseLeftWords(char* s, int k)
{
//定义变量⽤来记录字符串⻓度
int len = strlen(s);
//第⼀次反转
reverse(s, s + k - 1);
//第⼆次反转
reverse(s + k, s + len - 1);
//整体反转
reverse(s, s + len - 1);
//返回反转后的字符串
return s;
}
69. 解码异或后的数组
代码如下(示例):
int* decode(int* encoded, int encodedSize, int first, int* returnSize)
{
//a^b = c
//c^a --> a^b^a = b
//定义arr数组并分配内存
int* arr = (int*)malloc((encodedSize + 1) * sizeof(int));
//为arr数组第⼀个元素赋值
arr[0] = first;
int i = 0;
//为arr数组元素依次赋值
for (i = 1; i < encodedSize + 1; i++)
{
arr[i] = encoded[i - 1] ^ arr[i - 1];
}
//更新数组⻓度并返回数组
*returnSize = encodedSize + 1;
return arr;
}
70. 好数对的数⽬ - 题号:1512
代码如下(示例):
int numIdenticalPairs(int* nums, int numsSize)
{
int sum = 0;
int i = 0;
for (i = 0; i < numsSize; i++)
{
for (int j = i + 1; j < numsSize; j++)
{
if (nums[i] == nums[j])
{
sum++;
}
}
}
return sum;
}
int numIdenticalPairs(int* nums, int numsSize)
{
int i = 0;
//计数器
int cnt = 0;
//定义哈希表
int* arr = (int*)malloc((101) * sizeof(int));
// 将每个元素赋值为 0
for (int i = 1; i < 101; i++)
{
arr[i] = 0;
}
//遍历数组
for (i = 0; i < numsSize; i++)
{
//计数器加上当前元素在数组前⾯位置中出现的次数,并令出现的次数加⼀
cnt += arr[nums[i]]++;
}
////释放哈希表内存
free(arr);
//返回计数器
return cnt;
}
71. 拥有最多糖果的孩⼦ - 题号:1431
代码如下(示例):
bool* kidsWithCandies(int* candies, int candiesSize, int extraCandies, int* returnSize)
{
int i = 0;
bool* nums = (bool*)malloc(candiesSize * sizeof(bool));
for (i = 0; i < candiesSize; i++)
{
int ret = candies[i] + extraCandies;
int j = 0;
int flag = 0;
for (j = 0; j < candiesSize; j++)
{
if (ret < candies[j])
{
flag = 1;
}
}
if (flag == 1)
{
nums[i] = false;
}
else
{
nums[i] = true;
}
}
*returnSize = candiesSize;
return nums;
}
72. 第⼀个出现两次的字⺟
代码如下(示例):
char repeatedCharacter(char* s)
{
// 定义哈希数组
bool arr[26] = { 0 };
// 遍历字符串
while (*s)
{
// 检查当前字⺟是否被标记过,若被标记则直接返回当前字⺟
if (arr[*s - 'a'] == 1)
{
return *s;
}
// 否则标记当前字⺟
arr[*s - 'a'] = 1;
s++;
}
// 返回任意⼀个字符,防⽌编译错误
return ' ';
}
}
73. 统计星号 - 题号:2315
代码如下(示例):
int countAsterisks(char* s)
{
int count = 0;
int flag = 0;
while (*s)
{
if (*s == '|')
{
flag = !flag;
}
if (flag == 1)
{
// 在两个 | 之间
s++;
continue;
}
if (*s == '*')
{
count++;
}
s++;
}
return count;
}
74. 数组串联 - 题号:1929
代码如下(示例):
int* getConcatenation(int* nums, int numsSize, int* returnSize)
{
int* newnums = (int*)malloc(2 * numsSize * sizeof(int));
*returnSize = 2 * numsSize;
int i = 0;
for(i=0;i<numsSize ;i++)
{
newnums[i] = nums[i];
}
for(i=0;i<numsSize;i++)
{
newnums[i+numsSize] = nums[i];
}
return newnums;
}
75. 左右元素和的差值 - 题号:2574
代码如下(示例):
int* leftRigthDifference(int* nums, int numsSize, int* returnSize)
{
// 定义前缀和与后缀和数组
int leftSum[numsSize];
int rightSum[numsSize];
// 初始化前缀和数组的⾸位和后缀和数组的末位
leftSum[0] = rightSum[numsSize - 1] = 0;
int i = 0;
// 定义ans数组
int* answer = (int*)malloc(numsSize * sizeof(int));
// 为前缀和数组与后缀和数组赋值
for (i = 1; i < numsSize; i++)
{
leftSum[i] = leftSum[i - 1] + nums[i - 1];
// 后缀和数组⼀定要先为后⾯的元素赋值
rightSum[numsSize - i - 1] =
rightSum[numsSize - i] + nums[numsSize - i];
}
// 求出ans数组
for (i = 0; i < numsSize; i++)
{
answer[i] = abs(leftSum[i] - rightSum[i]);
}
// 更新数组⻓度后返回数组
*returnSize = numsSize;
return answer;
}
76. 爬楼梯 - 题号:70
代码如下(示例):
// 方法一:超出时间限制
int sum(int n)
{
//基本情况,需要终⽌递归,1~1的所有数的和为1本⾝,直接返回1
if (n == 1) return 1;
//否则返回1~n-1所有数的和加上n本⾝,即1~n所有数的和
return n + sum(n - 1);
}
int main() {
//假设n为5,求得1~5之间所有数的和
printf("%d", sum(5));
}
// 方法二:递归方法优化,记忆路线
//递归时间复杂度⾼
int climb(int x) {
//若x为1或2,则返回x(⾛到第⼀阶台阶的⽅法数为1,⾛到第⼆阶台阶的⽅法数为2)
if (x <= 2) return x;
//返回从第⼀阶台阶⾛到第x-1阶和第x-2阶台阶的⽅法数的和
return climb(x - 1) + climb(x - 2);
}
int climbStairs(int n) {
//返回从第⼀阶台阶⾛到第n阶台阶的⽅法数
return climb(n);
}
// 方法三:动态规划
//定义全局变量数组,⽤来记忆化搜索
int mem[50];
//定义递归函数
int climb(int x) {
//若参数⼩于等于2,则返回参数本⾝
if (x <= 2) return x;
//若函数值已经被计算过,则返回这个值
if (mem[x] != -1) return mem[x];
//否则计算这个函数值并返回
return mem[x] = climb(x - 1) + climb(x - 2);
}
int climbStairs(int n) {
int i = 0;
//初始化记忆数组
for (i = 1; i <= n; i++) mem[i] = -1;
//返回从第⼀阶台阶⾛到第n阶台阶的⽅法数
return climb(n);
}
int climbStairs(int n) {
//定义数组⽤来记录每⼀个位置的元素值
int climb[50];
//初始化前两个位置的元素值
climb[1] = 1;
climb[2] = 2;
int i = 0;
//遍历求得每个位置的元素值
for (i = 3; i <= n; i++) climb[i] = climb[i - 1] + climb[i - 2];
//返回第n个位置的元素值,即从第⼀阶台阶⾛到第n阶台阶的⽅法数
return climb[n];
}
// 方法四:动态规划空间优化
//递归时间复杂度⾼
int climbStairs(int n) {
//特判n⼩于等于2的情况
if (n <= 2)
return n;
else {
//定义三个变量就三个位置的元素值
int a = 1;
int b = 2;
int c = 0;
//进⾏n-2次操作
while (n > 2) {
//将a和b的和赋值给c,然后将b的值赋值给a,将c的值赋值给b
c = a + b;
a = b;
b = c;
n--;
}
//返回c的值
return c;
}
}
77. ⼆进制中1的个数 - 题号:剑指 Offer 15
代码如下(示例):
**int hammingWeight(uint32_t n)
{
int i = 0;
int cnt = 0;
for (i = 0; i < 32; i++)
{
if (((n >> i) & 1) == 1)
{
cnt++;
}
}
return cnt;
}
// int hammingWeight(uint32_t n) {
// int cnt = 0;
// while(n) {
// //最低位为1表⽰n为奇数
// if(n%2 == 1) //if((n&1)==1)
// cnt++;
//
// //右移操作相当于除以2
// n/=2; //n>>=1
// }
// return cnt;
// }
int hammingWeight(uint32_t n)
{
//定义变量作为计数器
int cnt = 0;
//计算n的⼆进制形式中1的个数
while (n)
{
n = n & (n - 1);
cnt++;
}
//返回答案
return cnt;
}**
78. ⼆分查找 - 题号:704
代码如下(示例):
int search(int* nums, int numsSize, int target)
{
int left = 0;
int right = numsSize - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (target > nums[mid])
{
left = mid + 1;
}
else if (target < nums[mid])
{
right = mid - 1;
}
else
{
return mid;
}
}
return -1;
}
79. 删除有序数组中的重复项
代码如下(示例):
int removeDuplicates(int* nums, int numsSize)
{
int fast = 1;
int slow = 1;
while (fast <= numsSize - 1)
{
if (nums[fast] != nums[fast - 1])
{
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
80. 排序矩阵查找 - 题号:⾯试题 10.09
代码如下(示例):
bool searchMatrix(int** matrix, int matrixSize, int matrixColSize, int target)
{
int i = 0;
for (i = 0; i < matrixSize; i++)
{
int j = 0;
for (j = 0; j < matrixColSize; j++)
{
if (target == matrix[i][j])
{
return true;
}
}
}
return false;
}
81. 只出现⼀次的数字 - 题号:136
代码如下(示例):
int singleNumber(int* nums, int numsSize) {
int i = 0;
int ret = 0;
//将每个数异或起来
for (i = 0; i < numsSize; i++) {
ret ^= nums[i];
}
return ret;
//nums[i]^=nums[i-1];
//return nums[numsSize-1];
}
82. 反转字符串 - 题号:344
代码如下(示例):
void reverseString(char* s, int sSize)
{
// 双指针的方法
int left = 0;
int right = sSize - 1;
while (left <= right)
{
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
return s;
}
void reverseString(char* s, int sSize)
{
char* left = s;
char* right = s + sSize - 1;
while (left <= right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
83. 字符串中的第⼀个唯⼀字符 - 题号:387
代码如下(示例):
int firstUniqChar(char* s)
{
int arr[256] = { 0 };
char* str = s;
while (*str)
{
arr[*str++]++;
}
str = s;
while (*str)
{
if (arr[*str] == 1)
{
return str - s;
}
str++;
}
return -1;
}
84. 找出星型图的中⼼节点 - 题号:1791
代码如下(示例):
int findCenter(int** edges, int edgesSize, int* edgesColSize)
{
//依次判断等式是否成⽴
if (edges[0][0] == edges[1][0]) return edges[0][0];
if (edges[0][0] == edges[1][1]) return edges[0][0];
if (edges[0][1] == edges[1][0]) return edges[0][1];
if (edges[0][1] == edges[1][1]) return edges[0][1];
//防⽌编译错误
return 0;
}
85. 两个数对之间的最⼤乘积差
代码如下(示例):
int maxProductDifference(int* nums, int numsSize)
{
// 先进行冒泡排序然后直接加减即可
int i = 0;
for (i = 0; i < numsSize - 1; i++)
{
int j = 0;
for (j = 0; j < numsSize - 1 - i; j++)
{
if (nums[j] > nums[j + 1])
{
int tmp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = tmp;
}
}
}
return (nums[numsSize - 1] * nums[numsSize - 2]) - (nums[0] * nums[1]);
}
86. 杨辉三⻆ - 题号:118
代码如下(示例):
int** generate(int numRows, int* returnSize, int** returnColumnSizes)
{
int i = 0;
//开辟存放杨辉三⻆的⼆维数组
int** arr = (int**)malloc(numRows * sizeof(int*));
//为每⼀维分配内存
for (i = 0; i < numRows; i++) {
arr[i] = (int*)malloc(numRows * sizeof(int));
}
//更新⾏数
*returnSize = numRows;
//存放每⼀⾏数据的个数
*returnColumnSizes = (int*)malloc(numRows * sizeof(int));
//按⾏从上到下遍历
for (i = 0; i < numRows; i++) {
int j = 0;
//更新每⼀⾏的元素个数
(*returnColumnSizes)[i] = i + 1;
//初始化每⼀⾏的⾸位和末位元素为1
arr[i][0] = arr[i][i] = 1;
//更新中间元素,遍历前两维时不会进⼊循环,不需要特判
for (j = 1; j < i; j++) {
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
}
//返回杨辉三⻆
return arr;
}
87. 替换空格 - 题号:剑指Offer 05
代码如下(示例):
char* pathEncryption(char* path)
{
int len = strlen(path);
int left = 0;
while (left != len)
{
if (path[left] == '.')
{
path[left] = ' ';
}
else
{
left++;
}
}
return path;
}
88. 各位相加 - 题号:258
代码如下(示例):
int addDigits(int num)
{
while (num > 9)
{
//证明还是两位数
int sum = 0;
while (num)
{
sum += num % 10;
num /= 10;
}
num = sum;
}
return num;
}
89. 按奇偶排序数组 - 题号:905
代码如下(示例):
int* sortArrayByParity(int* nums, int numsSize, int* returnSize)
{
//定义双指针
int l = 0;
int r = numsSize - 1;
//当两指针还未相遇时查找奇数在前的情况
while (l < r)
{
//查找最左边的奇数
while ((l < r) && nums[l] % 2 == 0)
{
l++;
}
//查找最右边的偶数
while ((l < r) && nums[r] % 2 == 1)
{
r--;
}
//若两指针未相遇进⾏交换
if (l < r) {
int tmp = nums[l];
nums[l] = nums[r];
nums[r] = tmp;
//交换后两指针相向移动继续查找
l++;
r--;
}
}
//更新数组⻓度后返回更新后的数组
*returnSize = numsSize;
return nums;
}
90. 分割平衡字符串 - 题号:1221
代码如下(示例):
int balancedStringSplit(char* s)
{
//定义变量作为平衡字符串计数器
int cnt = 0;
//定义两个变量作为字符'L'和'R'的计数器
int rc = 0;
int lc = 0;
//遍历字符串
while (*s)
{
//更新字符串计数
if (*s == 'R')
rc++;
else if (*s == 'L')
lc++;
//若两个字符计数器的值相等,则以上⼀个字符结尾+1作为起点,当前字符作为结尾满⾜平衡
if (rc == lc)
cnt++;
s++;
}
return cnt;
}
91. 差的绝对值为k的数对数⽬ - 题号:2006
代码如下(示例):
int countKDifference(int* nums, int numsSize, int k)
{
int i = 0;
int sum = 0;
for (i = 0; i < numsSize; i++)
{
int j = 0;
for (j = i; j < numsSize; j++)
{
if (k == abs(nums[i] - nums[j]))
{
sum++;
}
}
}
return sum;
}
92. 打印从1到最⼤的n位数
代码如下(示例):
int* countNumbers(int cnt, int* returnSize)
{
int sz = pow(10, cnt) - 1;
int* nums = (int*)malloc(sz * sizeof(int));
for (int i = 0; i < sz; i++)
{
nums[i] = i + 1;
}
*returnSize = sz;
return nums;
}
93. ⽣成每种字符都是奇数个的字符串 - 题号:1374
代码如下(示例):
char* generateTheString(int n)
{
//开辟⼀个⻓度为n+1的数组ans
char* ans = malloc((n + 1) * sizeof(char));
//初始化数组
memset(ans, 'a', n);
ans[n] = '\0';
//如果n位偶数,将第⼀个改为'b',a和b都是奇数个
if (n % 2 == 0)
ans[0] = 'b';
//返回字符串ans
return ans;
}
94. 将每个元素替换为右侧最⼤元素 - 题号:1299
代码如下(示例):
int* replaceElements(int* arr, int arrSize, int* returnSize)
{
int max = -1;
for (int i = arrSize - 1; i >= 0; i--)
{
int temp = arr[i];
arr[i] = max;
if (max < temp) max = temp;
}
*returnSize = arrSize;
return arr;
}
95. 交替合并字符串
代码如下(示例):
char* mergeAlternately(char* word1, char* word2) {
int flag = 1;
//定义⻓度⼤于等于两个字符串⻓度之和的字符串
char* ans = calloc(201, sizeof(char));
int i = 0;
//遍历两字符串
while (*word1 && *word2) {
//判断上⼀次合并的是哪个字符串,进⾏交替合并
if (flag == 1) {
ans[i++] = *word1++;
flag = 0;
}
else {
ans[i++] = *word2++;
flag = 1;
}
}
//如果word1先结束,将word2剩余的内容合并
if (*word1 == '\0') {
while (*word2) {
ans[i++] = *word2++;
}
}
//如果word2先结束,将word1剩余的内容合并
else {
while (*word1) {
ans[i++] = *word1++;
}
}
//返回拼接后的字符串
return ans;
}
96. 合并两个有序数组 - 题号:88
代码如下(示例):
//定义⽐较函数
int cmp(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int i = 0;
//将nums2数组中的内容全部追加到nums1中
for (i = 0; i < n; i++)
{
nums1[m + i] = nums2[i];
}
//将数组升序排序
qsort(nums1, nums1Size, sizeof(int), cmp);
}
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
//定义双指针分别指向nums1数组和nums2数组中的元素
int p1 = 0, p2 = 0;
//定义⼀个⻓度为n+m的新数组
int* sorted = malloc((n + m) * sizeof(int));
//当两指针都没有指向空时,进⼊循环将较⼩的元素存⼊sorted数组末位,并将相应指针后移
while (p1 < m && p2 < n) {
if (nums1[p1] < nums2[p2]) {
sorted[p1 + p2 - 1] = nums1[p1++];
}
else {
sorted[p1 + p2 - 1] = nums2[p2++];
}
}
//判断是否p1指针还有剩余
if (p1 < m) {
while (p1 < m) sorted[p1++ + n] = nums1[p1];
}
//否则p2指针还有剩余
else {
while (p2 < n) sorted[m + p2++] = nums2[p2];
}
int i;
//将合并后并排序的数组元素依次赋值给nums1数组
for (i = 0; i != m + n; ++i) {
nums1[i] = sorted[i];
}
}
97. ⾼度检查器 - 题号:1051
代码如下(示例):
int heightChecker(int* heights, int heightsSize)
{
// 先用冒泡排序
int i = 0;
int* tmp = (int*)malloc(heightsSize * sizeof(int));
memcpy(tmp, heights, heightsSize * sizeof(int));
int sum = 0;
for (i = 0; i < heightsSize - 1; i++)
{
int j = 0;
for (j = 0; j < heightsSize - 1 - i; j++)
{
if (heights[j] > heights[j + 1])
{
int tmp = heights[j];
heights[j] = heights[j + 1];
heights[j + 1] = tmp;
}
}
}
for (i = 0; i < heightsSize; i++)
{
if (heights[i] != tmp[i])
{
sum++;
}
}
return sum;
}
98. 找出数组排序后的⽬标下标 - 题号:2089
代码如下(示例):
int* targetIndices(int* nums, int numsSize, int target, int* returnSize)
{
int i = 0;
for (i = 0; i < numsSize - 1; i++){
int j = 0;
for (j = 0; j < numsSize - 1 - i; j++)
{
if (nums[j] > nums[j + 1])
{
int tmp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = tmp;
}
}
}
int cnt = 0;
for (int i = 0; i < numsSize; i++){
if (nums[i] == target)
cnt++;
}
int* ret = (int*)malloc(cnt * sizeof(int));
int sum = 0;
int k = 0;
for (i = 0; i < numsSize; i++){
if (nums[i] == target){
ret[k++] = i;
}
}
*returnSize = cnt;
return ret;
}
99. 反转链表 - 题号:剑指 Offer 24
代码如下(示例):
typedef struct ListNode
{
int val;
struct ListNode* next;
}ListNode;
struct ListNode* reverseList(struct ListNode* head) {
//定义两个指针⽤作反转
struct ListNode* cur = head;
struct ListNode* prev = NULL;
//当cur不为空时,代表链表还存在未反转的节点
while (cur) {
//定义指针指向指针cur的下⼀个节点避免链表断裂
struct ListNode* next_node = cur->next;
//实现反转操作
cur->next = prev;
//更新两个指针以便下⼀次迭代
prev = cur;
cur = next_node;
}
//将头指针指向指针prev指向的节点,完成反转
head = prev;
//返回头指针
return head;
}
100. 合并两个排序的链表 - 题号:剑指 Offer 25
代码如下(示例):
typedef struct ListNode
{
int val;
struct ListNode* next;
}ListNode;
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
//定义⼀个哑节点作为结果链表的头
struct ListNode* dummy = (struct ListNode*)malloc(sizeof(struct ListNode));
dummy->val = 0;
dummy->next = NULL;
//定义结果链表的尾,刚开始头尾相同
struct ListNode* curr = dummy;
//循环⽐较两个链表的头节点
while (l1 && l2) {
//将较⼩的节点接⼊结果链表中,并将该节点从原链表中删除
if (l1->val < l2->val) {
curr->next = l1;
l1 = l1->next;
}
else {
curr->next = l2;
l2 = l2->next;
}
//尾部后移
curr = curr->next;
}
//其中⼀个链表为空,将另⼀个链表的剩余节点全部接⼊结果链表
if (l1) {
curr->next = l1;
}
else {
curr->next = l2;
}
//返回哑节点dummy的next指针
return dummy->next;
}
整体的心得
刷完这一百道题,我相信,我们对C语言有了足够多的了解和认识,
这100道题用于大学生转专业和C语言期末考试
本篇文章是作者花费了3个月制作,从高考结束一直到大一开学,
也希望我的努力可以让C语言初学者有一个很好的理解!
整体源代码
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
// 1. 打印1-100的奇数
//int main()
//{
// int i = 0;
// for (i = 1; i <= 100; i++)
// {
// if (i % 2 == 1)
// printf("%d ", i);
// }
// return 0;
//}
//
//int main()
//{
// int i = 0;
// for (i = 1; i <= 100; i += 2)
// {
// printf("%d ", i);
// }
// return 0;
//}
// 打印9*9乘法表
//int main()
//{
// int i, j;
// for (i = 1; i <= 9; i++)
// {
// for (j = 1; j <= i; j++)
// {
// printf("%d*%d=%2d ", i, j, i * j);
// }
// printf("\n");
// }
//}
// 打印100-200的素数
//int main()
//{
// int i = 0;
// int j = 0;
// for (i = 100; i <= 200; i++)
// {
// int flag = 1;
// for (j = 2; j < i ; j++)
// {
// if (i % j == 0)
// {
// flag = 0;//不是素数
// break;
// }
// }
// if (flag == 1)
// printf("%d ", i);
// }
//}
// 优化版本
//#include<math.h>
//int main()
//{
// int i = 0;
// int j = 0;
// for (i = 101; i < 200; i+=2)
// {
// int flag = 1;
// for (j = 2; j <= sqrt(i); j++)
// {
// if (i % j == 0)
// {
// flag = 0;
// break;
// }
// }
// if (flag == 1)
// printf("%d ", i);
// }
//}
// 判断三角形
//int main()
//{
// int a, b, c;
// scanf("%d %d %d", &a, &b, &c);
// if ((a + b > c && a - b < c) || (b + c > a && b - c < a) || (a + c > b && a - c < b))
// {
// if ((a == b) && (a != c) || (a == c) && (a != b) || (b == c) && (b != a))
// printf("等腰三角形\n");
// else if (a == b && b == c)
// printf("等边三角形\n");
// else
// printf("普通三角形\n");
// }
// else
// {
// printf("非三角形\n");
// }
//}
// 判断三角形
//int main()
//{
// int a, b, c;
// scanf("%d %d %d", &a, &b, &c);
// if (a + b > c && b + c > a && a + c > b)
// {
// if (a == b && b == c)
// printf("等边三角形");
// else if (a == b || a == c || b == c)
// printf("等腰三角形");
// else
// printf("普通三角形");
// }
// else
// {
// printf("非三角形");
// }
//}
// 求最大公约数
//int main()
//{
// int a, b;
// int i = 0;
// scanf("%d %d", &a, &b);
// int c = (a > b ? b : a);
// for (i = c; i >=1; i--)
// {
// if (a % i == 0 && b % i == 0)
// {
// printf("%d\n", i);
// break;
// }
// }
//}
//int main()
//{
// int a, b;
// int i = 0;
// scanf("%d %d", &a, &b);
// int c = (a > b ? b : a);
// while (1)
// {
// if (a % c == 0 && b % c == 0)
// {
// break;
// }
// c--;
// }
// printf("%d\n", c);
// return 0;
//}
//int main()
//{
// int a, b;
// scanf("%d %d", &a, &b);
// int k = 0;
// while (k = a % b)
// {
// a = b;
// b = k;
// }
// printf("%d\n", b);
//}
//
//
////辗转相除法递归实现
//int gcd(int a, int b)
//{
// if (b == 0)
// return a;
// return gcd(b, a % b);
//}
// 求两个数的最小公倍数 方法一
//int main()
//{
// int a = 0;
// int b = 0;
// scanf("%d %d", &a, &b);
// int c = (a > b ? a : b);
// for (int i = c; i < a * b; i++)
// {
// if (i % a == 0 && i % b == 0)
// {
// printf("%d\n", i);
// break;
// }
// }
//}
//求两个数的最小公倍数 方法二
//int main()
//{
// int a = 0;
// int b = 0;
// scanf("%d %d", &a, &b);
// int c = a * b;
// int k = 0;
// // 辗转相除法求最大公约数 b
// while (k = a % b)
// {
// a = b;
// b = k;
// }
// printf("%d\n", c / b);
//}
// error
//int main()
//{
// int i = 1;
// int j = 1;
// for (i = 1; i <= 100; i++)
// {
// if (i % 2 == 0)
// i = i * (-1);
// j = j + 1 / i;
// }
// printf("%d\n", j);
//}
//int main()
//{
// int i = 0;
// double sum = 0;
// for (i = 1; i <= 100; i++)
// {
// if (i % 2 == 1)
// sum += 1.0 / i;
// else
// sum -= 1.0 / i;
// }
// printf("%lf\n", sum);
//}
// 第一种方法
//void bubblesort(int arr[], int sz)
//{
// int i = 0;
// for (i = 0; i < sz - 1; i++)
// {
// int j = 0;
// for (j = 0; j < sz - 1 - i; j++)
// {
// if (arr[j] > arr[j + 1])
// {
// int tmp = arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = tmp;
// }
// }
// }
//}
//int main()
//{
// int arr[10] = { 0 };
// int i = 0;
// for (i = 0; i < 10; i++)
// {
// scanf("%d", &arr[i]);
// }
// int sz = sizeof(arr)/sizeof(arr[0]);
// bubblesort(arr, sz);
// printf("%d\n", arr[9] - arr[0]);
//
//}
// 第二种方法
//int main()
//{
// int arr[10] = { 0 };
// int i = 0;
// for (i = 0; i < 10; i++)
// {
// scanf("%d", &arr[i]);
// }
// int Max = arr[0];
// int Min = arr[0];
// for (i = 1; i < 10; i++)
// {
// if (arr[i] > Max)
// Max = arr[i];
// if (arr[i] < Min)
// Min = arr[i];
// }
// printf("%d\n", Max - Min);
// return 0;
//}
// 第三种方法
//int main()
//{
// int arr;
// scanf("%d", &arr);
// int Max = arr;
// int Min = arr;
// int i = 0;
// for (i = 1; i < 10; i++)
// {
// scanf("%d", &arr);
// if (arr > Max)
// Max = arr;
// if (arr < Min)
// Min = arr;
// }
// printf("%d\n", Max - Min);
// return 0;
//}
// 冒泡排序
//void BubbleSort(int arr[], int sz)
//{
// int i = 0;
// int j = 0;
// for (i = 0; i < sz - 1; i++)
// {
// for (j = 0; j < sz - 1 - i; j++)
// {
// if (arr[j] > arr[j + 1])
// {
// int tmp = arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = tmp;
// }
// }
// }
//}
//void arrPrintf(int arr[], int sz)
//{
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// printf("%d ", arr[i]);
// }
//}
//int main()
//{
// int arr[10] = { 0 };
// int i = 0;
// int sz = sizeof(arr) / sizeof(arr[0]);
// for (i = 0; i < 10; i++)
// {
// scanf("%d", &arr[i]);
// }
// BubbleSort(arr, sz);
// arrPrintf(arr, sz);
//}
//#include <stdio.h>
//int main()
//{
// int arr[10] = { 0 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// scanf("%d", &arr[i]);
// }
// for (i = 0; i < sz - 1; i++)
// {
// int j = 0;
// int flag = 1;//假设待排序的数据已经有序
// for (j = 0; j < sz - 1 - i; j++)
// {
// if (arr[j] > arr[j + 1])
// {
// flag = 0;
// int tmp = arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = tmp;
// }
// }
// if (flag == 1)
// break;
// }
// for (i = 0; i < sz; i++)
// {
// printf("%d ", arr[i]);
// }
// return 0;
//}
//#include <stdio.h>
//int main()
//{
// int arr[10] = { 0 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// scanf("%d", &arr[i]);
// }
// for (i = 0; i < sz - 1; i++)
// {
// int j = 0;
// for (j = 0; j < sz - 1 - i; j++)
// {
// if (arr[j] > arr[j + 1])
// {
// int tmp = arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = tmp;
// }
// }
// }
// for (i = 0; i < sz; i++)
// {
// printf("%d ", arr[i]);
// }
// return 0;
//}
// 判断盗窃者
//int main()
//{
// int thieves = 0;
// for (thieves = 'a'; thieves <= 'd'; thieves++)
// {
// if ((thieves != 'a') + (thieves == 'c') + (thieves == 'd') + (thieves != 'd') == 3)
// printf("盗窃者是: %c", thieves);
// }
//}
// 判断自幂数
//#include <math.h>
//int main()
//{
// int i = 0;
// for (i = 1; i <= 100000; i++)
// {
// //判断i是否是?幂数
// //1. 计算i的位数n
// int n = 1;
// int tmp = i;
// while (tmp / 10)
// {
// n++;
// tmp /= 10;
// }
// //2. 计算i的每?位的n次?之和
// tmp = i;
// int sum = 0;
// while (tmp)
// {
// sum += (int)pow(tmp % 10, n);
// tmp /= 10;
// }
// //3. 输出
// if (sum == i)
// printf("%d ", i);
// }
// return 0;
//}
//int main()
//{
// int n = 0;
// scanf("%d", &n);
// //打印上半部分的n行
// int i = 0;
// for (i = 0; i < n; i++)
// {
// int j = 0;
// for (j = 0; j < n - 1 - i; j++)
// {
// printf(" ");
// }
// for (j = 0; j < 2 * i + 1; j++)
// {
// printf("*");
// }
// printf("\n");
// }
// //打印下半部分的n-1?
// for (i = 0; i < n; i++)
// {
// int j = 0;
// for (j = 0; j <= i; j++)
// {
// printf(" ");
// }
// for (j = 0; j < 2 * (n - 1 - i) - 1; j++)
// {
// printf("*");
// }
// printf("\n");
// }
// return 0;
//}
// 喝多少汽水
//int main()
//{
// int n = 0;
// scanf("%d", &n);
// int total = 0;
// int empty = 0;
// total += n;
// empty += n;
// while (empty >= 2)
// {
// total += empty / 2;
// empty = empty / 2 + empty % 2;
// }
// printf("%d\n", total);
//}
// 第二种方法
//int main()
//{
// int n = 0;
// int total = 0;
// scanf("%d", &n);
// if (n == 0)
// total = 0;
// else
// total = 2 * n - 1;
// printf("%d\n",total);
// return 0;
//}
////方法一:不使用库函数
//int main()
//{
// char buf[31] = { 0 };
// scanf("%[^\n]", buf);
// int i = 0;
// while (buf[i])
// {
// if (buf[i] >= 'a' && buf[i] <= 'z')
// buf[i] -= 32;
//
// else if (buf[i] >= 'A' && buf[i] <= 'Z')
// buf[i] += 32;
// i++;
// }
// printf("%s\n", buf);
// return 0;
//}
////?法2:使?库函数
//#include <ctype.h>
//int main()
//{
// char buf[31] = { 0 };
// scanf("%[^\n]s", buf);
// int i = 0;
// while (buf[i])
// {
// if (islower(buf[i]))
// buf[i] = toupper(buf[i]);
// else if (isupper(buf[i]))
// buf[i] = tolower(buf[i]);
// i++;
// }
// printf("%s\n", buf);
// return 0;
//}
// 交换两个整数
//void Swap(int* pa, int* pb)
//{
// int tmp = *pa;
// *pa = *pb;
// *pb = tmp;
//}
//int main()
//{
// int a, b;
// scanf("%d %d", &a, &b);
// Swap(&a, &b);
// printf("%d %d\n", a, b);
//}
// 求两个整数的平均值
//int average(int a, int b)
//{
// return (a+b)/2;
//}
//int average(int a, int b)
//{
// return a+(b-a)/2;
//}
//int main()
//{
// int a, b;
// scanf("%d %d", &a, &b);
// int ret = average(a, b);
// printf("%d\n", ret);
//}
// 求字符串长度
//模拟实现strlen函数的第一种方法
//#include<assert.h>
//size_t my_first_strlen(const char* string)
//{
// assert(string);
// int count = 0;
// while (*string != '\0')
// {
// string++;
// count++;
// }
// return count;
//}
//int main()
//{
// char arr[10] = "abcdef";
// int ret = my_first_strlen(arr);
// printf("%d\n", ret);
// return 0;
//}
// 第二种方法:递归
//#include<assert.h>
//size_t my_second_strlen(const char* str)
//{
// assert(str != NULL);
// if (*str != '\0')
// {
// return 1 + my_second_strlen(str + 1);
// }
// else
// {
// return 0;
// }
//}
//int main()
//{
// char arr[10] = "abcdef";
// int ret = my_second_strlen(arr);
// printf("%d\n", ret);
// return 0;
//}
// 第三种方法:指针-指针
//#include<assert.h>
//size_t my_third_strlen(const char* str)
//{
// assert(str != NULL);
// const char* start = str;
// while (*str != '\0')
// {
// str++;
// }
// return str - start;
//}
//int main()
//{
// char arr[10] = "abcdef";
// int ret = my_third_strlen(arr);
// printf("%d\n", ret);
// return 0;
//}
//// 逆序字符串
//#include<string.h>
//void reverse(char* arr)
//{
// int ret = strlen(arr);
// char* left = arr;
// char* right = arr + ret - 1;
// while (left < right)
// {
// char tmp = *left;
// *left = *right;
// *right = tmp;
// left++;
// right--;
// }
//}
//int main()
//{
// char arr[31] = { 0 };
// scanf("%[^\n]", arr);
// reverse(arr);
// printf("%s\n", arr);
//}
//// 方法二
//int digit_sum(int m)
//{
// int sum = 0;
// while (m)
// {
// sum += m % 10;
// m /= 10;
// }
// //返回每?位的和
// return sum;
//}
//// 求数字的每一位之和
//// 方法一
//int main()
//{
// int n = 0;
// scanf("%d", &n);
// int sum = 0;
// while (n / 10)
// {
// sum += n % 10;
// n /= 10;
// }
// sum += n % 10;
// printf("%d\n", sum);
//}
//#include<string.h>
//// 判断字符串
//int main()
//{
// char arr[31] = { 0 };
// scanf("%[^\n]s", arr);
// int len = strlen(arr);
// char* left = arr;
// char* right = arr + len - 1;
// while (left < right)
// {
// if (*left != *right)
// {
// printf("NO");
// return 0;
// }
// left++;
// right--;
// }
// printf("YES");
//}
//// 计算天数
//#include <stdio.h>
//int get_month_of_day(int y, int m)
//{
// //将每个?份的天数记录在数组中
// int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
//
// //获取?份的天数
// int day = days[m];
//
// //特判??天数是29天的情况
// if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
// {
// if (m == 2)
// day += 1;
// }
// return day;
//}
//int main()
//{
// int y = 0;
// int m = 0;
// //输?
// scanf("%d %d", &y, &m);
// //获取y年m?的天数
// int ret = get_month_of_day(y, m);
// printf("%d\n", ret);
// return 0;
//}
// 删除指定的数字 err样例
//int main()
//{
// int arr[10] = { 0 };
// int i = 0;
// for (i = 0; i<sizeof(arr) / sizeof(arr[0]); i++)
// {
// scanf("%d", &arr[i]);
// }
// int n = 0;
// scanf("%d", &n);
// for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
// {
// if (n == arr[i])
// arr[i] = arr[i + 1];
// }
// for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
// {
// printf("%d ", arr[i]);
// }
//}
// 删除指定的数字
//int main()
//{
// int count = 0;
// int arr[10] = { 0 };
// int i = 0;
// int sz = sizeof(arr) / sizeof(arr[0]);
// for (i = 0; i < sz; i++)
// {
// scanf("%d", &arr[i]);
// }
// int n = 0;
// scanf("%d", &n);
// for (i = 0; i < sz; i++)
// {
// if (n == arr[i])
// {
// count++;
// int j = 0;
// for (j = i; j < sz -1; j++)
// {
// arr[j] = arr[j + 1];
// }
// }
// }
// for (i = 0; i < sz-count; i++)
// {
// printf("%d ", arr[i]);
// }
//}
// 方法二
//int main()
//{
// int arr[10] = { 0 };
// int del = 0;
// int i = 0;
// //输?
// for (i = 0; i < 10; i++)
// {
// scanf("%d", &arr[i]);
// }
// scanf("%d", &del);
//
// //删除
// int j = 0;
// for (i = 0; i < 10; i++)
// {
// //若当前数与给定值不相同,不需要删除,
// //将其填?第j个位置,将j后移
// if (arr[i] != del)
// arr[j++] = arr[i];
// }
//
// //打印
// for (i = 0; i < j; i++)
// {
// printf("%d ", arr[i]);
// }
// return 0;
//}
// 字符串拷贝--
//int main()
//{
// char arr1[20] = "abcdef";
// char arr2[20] = {0};
// char* str1 = arr1;
// char* str2 = arr2;
// while (*str1 != '\0')
// {
// *str2 = *str1;
// str1++;
// str2++;
// }
// *str2 = '\0';
// printf("%s\n", arr2);
//}
// 方法一
//void my_strcpy(char* dest, const char* src)
//{
// while (*src != '\0') {
// *dest = *src;
// dest++;
// src++;
// }
// // 拷贝原字符串的结束标志
// *dest = '\0';
//}
//int main()
//{
// char arr1[] = "hello bite";
// char arr2[20] = { 0 };
//
// //将字符串arr1中的内容拷?到字符串arr2中
// my_strcpy(arr2, arr1);
// //打印字符串arr2
// printf("%s\n", arr2);
// return 0;
//}
// 方法二
//void my_strcpy(char* dest, const char* src)
//{
// while (*dest++ = *src++)
// {
// ;
// }
//}
//int main()
//{
// char arr1[] = "hello bite";
// char arr2[20] = { 0 };
//
// //将字符串arr1中的内容拷?到字符串arr2中
// my_strcpy(arr2, arr1);
// //打印字符串arr2
// printf("%s\n", arr2);
// return 0;
//}
//// 合并有序数组
//int main()
//{
// int n, m;
// scanf("%d %d", &n, &m);
// int arr1[30] = { 0 };
// int arr2[30] = { 0 };
// int arr3[60] = { 0 };
// int i, j, k = 0; //k最开始没有初始化为0
// for (i = 0; i < n; i++)
// {
// scanf("%d", &arr1[i]);
// }
// for (j = 0; j < m; j++)
// {
// scanf("%d", &arr2[j]);
// }
// i = 0, j = 0;
// while (i < n && j < m)
// {
// if (arr1[i] < arr2[j])
// {
// arr3[k] = arr1[i];
// k++;
// i++;
// }
// else if (arr1[i] > arr2[j])
// {
// arr3[k] = arr2[j];
// k++;
// j++;
// }
// else
// {
// arr3[k] = arr1[i];
// k++;
// i++;
// }
// }
// if (i == n)
// {
// for (; j < m; j++)
// {
// arr3[k] = arr2[j];
// k++;
// }
// }
// if (j == m)
// {
// for (; i < n; i++)
// {
// arr3[k] = arr1[i];
// k++;
// }
// }
// for (k = 0; k < m + n; k++)
// {
// printf("%d ", arr3[k]);
// }
//}
//int sum(int num1, int num2)
//{
// return num1 + num2;
//}
//int game(int* guess, int guessSize, int* answer, int answerSize)
//{
// int i = 0;
// int cnt = 0;
// for (i = 0; i < guessSize; i++)
// {
// if (guess[i] == answer[i]) {
// cnt++;
// }
// }
// return cnt;
//}
//#include<stdlib.h>
//double* convertTemperature(double celsius, int* returnSize)
//{
// double* str = (double*)malloc(2 * sizeof(double));
// str[0] = celsius + 273.15;
// str[1] = celsius * 1.80 + 32.00;
// *returnSize = 2;
// return str;
//}
//int smallestEvenMultiple(int n) {
// //判断n是不是偶数
// if (n % 2 == 0)
// return n;
// //如果不是偶数,则?定是奇数
// else
// return 2 * n;
//}
//
//int smallestEvenMultiple(int n) {
// //判断n是不是偶数
// if (n & 1 == 0)
// return n;
// //如果没有进?上?步操作,直接返回n为奇数时的结果2*n即可
// return 2 * n;
//}
//int xorOperation(int n, int start)
//{
// int arr[n];
// int i = 0;
// for (i = 0; i < n; i++)
// {
// arr[i] = start + 2 * i;
// }
// int ret = 0;
// for (i = 0; i < n; i++)
// {
// ret ^= arr[i];
// }
// return ret;
//}
//
//int xorOperation(int n, int start) {
// int i = 0;
// int ret = 0;
// int u;
// for (i = 0; i < n; i++) {
// //将nums[i]的值存放在u中,每次更新u的值
// u = start + 2 * i;
// ret ^= u;
// }
// return ret;
//}
//#include<math.h>
//int differenceOfSum(int* nums, int numsSize)
//{
// int x = 0;
// int y = 0;
// for (int i = 0; i < numsSize; i++)
// {
// x += nums[i];
// while (nums[i])
// {
// y += nums[i] % 10;
// nums[i] /= 10;
// }
// }
// return abs(x - y);
//}
//bool isPalindrome(int x)
//{
// if (x < 0)
// {
// return false;
// }
//
// long long n = 0;
// int tmp = x;
// while (tmp)
// {
// n = n * 10 + tmp % 10;
// tmp /= 10;
// }
// return x == n;
//}
//// 方法一:
//#include<stdlib.h>
//int* smallerNumbersThanCurrent(int* nums, int numsSize, int* returnSize)
//{
// int* tmp = (int*)malloc(numsSize * sizeof(int));
// for (int i = 0; i < numsSize; i++)
// {
// int count = 0;
// for (int j = 0; j < numsSize; j++)
// {
// if (nums[i] > nums[j])
// {
// count++;
// }
// }
// tmp[i] = count;
// }
// *returnSize = numsSize;
// return tmp;
//}
//
//
//// 方法二
//int low(int* order, int orderSize, int u) {
// int i;
// //定义左右两边界,l为最左边,r为最右边
// int l = 0, r = orderSize - 1;
//
// //当l<r时表?l~r之间还未被查找
// while (l < r) {
// //mid为l和r的中点,向下取整
// int mid = (l + r) / 2;
// //如果在有序数组中下标为中点的数?于要查找的数,则要查找的数?定在中点右边,将左边界修改为中
// if (order[mid] < u) l = mid + 1;
// //否则在中点处或者中点左边部分,将右边界修改为中点,
// else r = mid;
// }
// //当查找完成时l=r,返回其中?个即可
// return l;
//}
//int* smallerNumbersThanCurrent(int* nums, int numsSize, int* returnSize) {
// //定义答案数组
// int* ans = malloc(numsSize * sizeof(int));
// //定义有序数组
// int* order = malloc(numsSize * sizeof(int));
// int i = 0, j = 0;
//
// //将原数组中的数放?有序数组,之后进?排序
// for (i = 0; i < numsSize; i++) order[i] = nums[i];
//
// //此段代码为冒泡排序,时间复杂度较?,有兴趣可以修改此段代码为其他时间复杂度较低的排序代
// for (i = 0; i < numsSize; i++) {
// //此层循环为将当前数组最?值(除了之前已经找到的最?值之外)放?数组最后?(nunmsS
// for (j = 0; j < numsSize - i - 1; j++) {
// //如果两个相邻的数之间左边的?较?,则交换相邻的两个数
// if (order[j] > order[j + 1]) {
// int u = order[j];
// order[j] = order[j + 1];
// order[j + 1] = u;
// }
// }
// }
//
// //更新答案数组
// for (int i = 0; i < numsSize; i++) {
// //将当前数在有序数组中的下标存?答案数组,order:有序数组,numsSize:数组?度,nums[
// ans[i] = low(order, numsSize, nums[i]);
// }
//
// //更新数组?度并返回数组
// *returnSize = numsSize;
// return ans;
//}
//
//
//
//// 方法三:
//int* smallerNumbersThanCurrent(int* nums, int numsSize, int* returnSize) {
// //定义答案数组,排序数组,哈希表数组
// int* ans = malloc(numsSize * sizeof(int));
// int* order = malloc(numsSize * sizeof(int));
// int* bucket = malloc(110 * sizeof(int));
// int i = 0, j = 0;
// //初始化哈希表数组中的值为-1
// //防?出现重复情况,哈希表?个下标放?多个值,仅当桶?值为-1时更新桶?的值
// for (i = 0; i < 101; i++) bucket[i] = -1;
//
// //将原数组中的值放?排序数组
// for (i = 0; i < numsSize; i++) order[i] = nums[i];
// //此段代码为冒泡排序,时间复杂度较?,有兴趣可以修改此段代码为其他排序代码,内容同上
// for (i = 0; i < numsSize; i++) {
// for (j = 0; j < numsSize - i - 1; j++) {
// if (order[j] > order[j + 1]) {
// int u = order[j];
// order[j] = order[j + 1];
// order[j + 1] = u;
// }
// }
// }
// //定义变量cnt记录当前数是否重复出现,若第?次出现则记录当前位置,使得之后的重复的数都被赋值
// int cnt = 0;
// for (i = 0; i < numsSize; i++) {
// //若第?次出现,则更新cnt
// if (bucket[order[i]] == -1) cnt = i;
// //将当前数第?次出现的位置放?桶?
// bucket[order[i]] = cnt;
// }
//
// //遍历原数组,将数字在桶?的值放?答案数组
// for (i = 0; i < numsSize; i++) {
// ans[i] = bucket[nums[i]];
// }
//
// //更新数组?度并返回答案数组
// *returnSize = numsSize;
// return ans;
//}
//int percentageLetter(char* s, char letter)
//{
// int sum = 0;
// int ret = strlen(s);
// while (*s)
// {
// if (*s == letter)
// {
// sum++;
// }
// s++;
// }
// return sum * 100 / ret;
//}
//bool isUnique(char* astr) {
// int i = 0;
// //定义数组?来标记每个字?是否出现,0为未出现过,1为已经出现过
// bool hash[26] = { 0 };
// //遍历字符串,当字符不为空时进?循环
// while (astr[i]) {
// //若当前字?之前被标记过返回false
// if (hash[astr[i] - 'a'] == 1)
// return false;
// //否则标记当前字?
// else
// hash[astr[i] - 'a'] = 1;
// //下标+1,继续遍历下?个字符
// i++;
// }
// //遍历结束,未出现重复,则返回true
// return true;
//}
//
//bool isUnique(char* astr) {
// int i = 0;
// //定义变量?来标记
// int s = 0;
// while (astr[i]) {
// //在这?定义u直接表?为左移后的结果
// //astr[i]-'a'即为astr[i]在字?表中的顺序-1,即上?所说的w-1
// int u = 1 << (int)(astr[i] - 'a');
// //若未被标记则标记此位,即s加上u;
// if ((u & s) == 0) s += u;
// //若之前已经被标记,则返回false;
// else return false;
// i++;
// }
// //遍历结束不存在重复则返回true
// return true;
//}
//char* defangIPaddr(char* address)
//{
// int len = strlen(address);
// char* ptr = NULL;
// char* ans = ptr = malloc(len + 6 + 1);
// while (*address)
// {
// if (*address == '.')
// {
// *ptr = '[';
// ptr++;
// *ptr = '.';
// ptr++;
// *ptr = ']';
// ptr++;
// }
// else
// {
// *ptr++ = *address;
// }
// address++;
// }
// *ptr = '\0';
// return ans;
//}
//int mostWordsFound(char** sentences, int sentencesSize)
//{
// int i = 0;
// int max = 0;
// for (i = 0; i < sentencesSize; i++)
// {
// int word = 1;
// int j = 0;
// while (sentences[i][j])
// {
// if (sentences[i][j] == ' ')
// {
// word++;
// }
// j++;
// }
// if (max < word)
// {
// max = word;
// }
// }
// return max;
//}
//bool isSameAfterReversals(int num)
//{
// int tmp = num;
// long long n = 0;
// while (tmp)
// {
// n = n * 10 + tmp % 10;
// tmp /= 10;
// }
// while (n)
// {
// tmp = tmp * 10 + n % 10;
// n /= 10;
// }
// if (tmp == num)
// {
// return true;
// }
// else
// {
// return false;
// }
//}
//
//bool isSameAfterReversals(int num)
//{
// int tmp = num;
// int n = 0;
// while (tmp)
// {
// n = n * 10 + tmp % 10;
// tmp /= 10;
// }
// while (n)
// {
// tmp = tmp * 10 + n % 10;
// n /= 10;
// }
// return num == tmp;
//}
//
//// 方法二:只要num个位数不为0,返回正确
//bool isSameAfterReversals(int num)
//{
// return num == 0 || num % 10 != 0;
//}
//int findGCD(int* nums, int numsSize)
//{
// int i = 0;
// for (i = 0; i < numsSize - 1; i++)
// {
// for (int j = 0; j < numsSize - 1 - i; j++)
// {
// if (nums[j] < nums[j + 1])
// {
// int tmp = nums[j];
// nums[j] = nums[j + 1];
// nums[j + 1] = tmp;
// }
// }
// }
// int a = nums[0];
// int b = nums[numsSize - 1];
// int c = (a > b ? b : a);
// while (1)
// {
// if (a % c == 0 && b % c == 0)
// {
// break;
// }
// c--;
// }
// return c;
//}
//int findNumbers(int* nums, int numsSize)
//{
// int sum = 0;
// int i = 0;
// for (i = 0; i < numsSize; i++)
// {
// int ret = nums[i];
// int tmp = 0;
// while (ret % 10 == 0)
// {
// tmp++;
// ret = ret / 10;
// }
// if (tmp % 2 == 0)
// {
// sum++;
// }
// }
// return sum;
//}
//int main()
//{
// int arr[] = { 12,345,2,6,7896 };
// int len = sizeof(arr) / sizeof(arr[0]);
// int sum = findNumbers(arr, len);
// return 0;
//}
//int findNumbers(int* nums, int numsSize)
//{
// int sum = 0;
// int i = 0;
// for (i = 0; i < numsSize; i++)
// {
// int ret = nums[i];
// int tmp = 0;
// while (ret)
// {
// tmp++;
// ret = ret / 10;
// }
// if (tmp % 2 == 0)
// {
// sum++;
// }
// }
// return sum;
//}
//
//#include<string.h>
//int findNumbers(int* nums, int numsSize)
//{
// int i = 0;
// int ans = 0;
// //定义字符串数组?来存放转化后的字符串
// char arr[7] = {};
// for (i = 0; i < numsSize; i++) {
// //将数字转化为字符串
// sprintf(arr, "%d", nums[i]);
// //字符串?度为偶数,即当前数字位数为偶数时记录?次
// if (strlen(arr) % 2 == 0) {
// ans++;
// }
// }
// //返回位数为偶数的数字个数
// return ans;
//}
#include<stdlib.h>
//int* separateDigits(int* nums, int numsSize, int* returnSize)
//{
// int i = 0;
// int tmp = 0;
// //定义数组作为返回值并且分配内存
// int* ans = malloc(6 * 1000 * sizeof(int));
// int k = 0;
// for (i = 0; i < numsSize; i++)
// {
// int n = nums[i];
// int j = 0;
// //反转n放?tmp
// while (n)
// {
// tmp = tmp * 10 + n % 10;
// n /= 10;
// }
// //正向存储到ans
// while (tmp)
// {
// ans[k++] = tmp % 10;
// tmp /= 10;
// }
// }
// *returnSize = k;
// return ans;
//}
//int getLength(int num)
//{
// int length = 0;
// while (num != 0)
// {
// length++;
// num /= 10;
// }
// return length;
//}
//
//void reverse(int* answer, int start, int end)
//{
// for (int i = start, j = end; i < j; i++, j--)
// {
// int temp = answer[i];
// answer[i] = answer[j];
// answer[j] = temp;
// }
//}
//
//int* separateDigits(int* nums, int numsSize, int* returnSize)
//{
// int totalLength = 0;
// for (int i = 0; i < numsSize; i++)
// {
// totalLength += getLength(nums[i]);
// }
// int* answer = (int*)malloc(sizeof(int) * totalLength);
// *returnSize = totalLength;
// int index = 0;
// for (int i = 0; i < numsSize; i++)
// {
// int start = index;
// int temp = nums[i];
// while (temp != 0)
// {
// answer[index] = temp % 10;
// index++;
// temp /= 10;
// }
// reverse(answer, start, index - 1);
// }
// return answer;
//}
//int calculate(char* s)
//{
// //定义x和y并初始化
// int x = 1;
// int y = 0;
// //遍历字符串数组,字符串数组指针直接指向字符串?位,则遍历时直接获取指针指向的字符,判断
// while (*s)
// {
// //判断当前字符,并执?相应操作
// if (*s == 'A')
// x = 2 * x + y;
// else if (*s == 'B')
// y = 2 * y + x;
// //字符串指针后移,完成遍历操作
// s++;
// }
// //返回操作执?完成后的两值之和
// return x + y;
//}
//char* toLowerCase(char* s)
//{
// int i = 0;
// while (s[i])
// {
// if (s[i] >= 'A' && s[i] <= 'Z')
// {
// s[i] += 32;
// }
// i++;
// }
// return s;
//}
//int pivotInteger(int n)
//{
// int x = 0;
// int sum1 = 0;
// int sum2 = 0;
// for (int i = 1; i < x; i++)
// {
// sum1 += i;
// }
// for (int i = x; i < n; i++)
// {
// sum2 += i;
// }
// if (sum1 == sum2)
// {
// return x;
// }
// else
// {
// return -1;
// }
//}
//int main()
//{
// int n = 8;
// printf("%d\n", pivotInteger(n));
//}
//int pivotInteger(int n)
//{
// int i;
// //遍历1~n
// for (i = 1; i <= n; i++)
// {
// //若i满?1~i的和与i~n的和相等,则返回i
// if ((1 + i) * i / 2 == (i + n) * (n - i + 1) / 2)
// return i;
// }
// //当1~n都不能满?题意时,返回-1
// return -1;
//}
//int commonFactors(int a, int b)
//{
// int c = a > b ? b : a;
// int i = 0;
// int sum = 0;
// for (i = 1; i <= c; i++)
// {
// if (a % i == 0 && b % i == 0)
// {
// sum++;
// }
// }
// return sum;
//}
#include<string.h>
//int finalValueAfterOperations(char** operations, int operationsSize)
//{
// int i;
// //定义变量并初始化
// int x = 0;
// //遍历操作数组
// for (i = 0; i < operationsSize; i++)
// {
// //使?strcmp函数对字符串进??较,若字符串是"X++"或"++X"其中之?,则进?x++操作
// if (!strcmp(operations[i], "X++") || !strcmp(operations[i], "++X"))
// {
// x++;
// }
// //否则进?x--操作
// else
// {
// x--;
// }
//
// //另?种写法:
// /*
// if(operations[i][1]=='+') x++;
// else x--;
// */
// }
// //返回最终值
// return x;
//}
#include<stdlib.h>
//typedef struct
//{
// int parking[3];
//}ParkingSystem;
//
//// 初始化停车场系统
//ParkingSystem* parkingSystemCreate(int big, int medium, int small)
//{
// // 为停车场系统指针分配内存
// ParkingSystem* obj = (ParkingSystem*)malloc(sizeof(ParkingSystem));
// // 分别将三个函数参数赋值给停车场系统的停车位数量
// obj->parking[0] = big;
// obj->parking[1] = medium;
// obj->parking[2] = small;
// // 返回停车场系统指针
// return obj;
//}
//// 添加车辆
//bool parkingSystemAddCar(ParkingSystem* obj, int carType)
//{
// // 如果相应的停车位数量为0,则添加失败
// if (obj->parking[carType - 1] == 0)
// {
// return false;
// }
// // 否则添加成功,相应停车位数量减?
// else
// {
// obj->parking[carType - 1]--;
// return true;
// }
//}
//// 释放停车场系统内存
//void parkingSystemFree(ParkingSystem* obj)
//{
// free(obj);
//}
//int** flipAndInvertImage(int** image, int imageSize, int* imageColSize,
// int* returnSize, int** returnColumnSizes)
//{
// int i = 0;
// int j = 0;
// // ?平翻转
// for (i = 0; i < imageSize; i++) {
// int l = 0;
// int r = imageSize - 1;
// // 逆序当前?,当l=r时不需要交换
// while (l < r) {
// // 交换
// int tmp = image[i][l];
// image[i][l] = image[i][r];
// image[i][r] = tmp;
// // 左指针右移,右指针左移,交换下?组
// l++;
// r--;
// }
// }
// // 遍历数组所有位置进?反转
// for (i = 0; i < imageSize; i++) {
// for (j = 0; j < imageSize; j++) {
// // ?1减去当前值即可完成反转
// image[i][j] = 1 - image[i][j];
// }
// }
// // 另?种写法,在逆序时直接反转,?实际复杂度优化,只是提?代码复?率
// /*
// for(i=0; i<imageSize; i++) {
// int l = 0;
// int r = imageSize-1;
// //逆序当前?,当l=r时不需要交换
// while(l<r) {
// //交换
// int tmp = image[i][l];
// image[i][l] = image[i][r];
// image[i][r] = tmp;
// //反转
// image[i][l]=1-image[i][l];
// image[i][r]=1-image[i][r];
// l++;r--;
// }
// //当l=r时不需要交换,但是需要反转
// if(l==r) image[i][l]=1-image[i][l];
// }
// */
// // 参数的解释很重要,数组的?列?度都未发?变化,直接赋值为原数组?度
// * returnSize = imageSize;
// *returnColumnSizes = imageColSize;
// // 返回操作完成后的数组
// return image;
//}
//struct ListNode* trainingPlan(struct ListNode* head, int cnt)
//{
// if (head == NULL)
// {
// return NULL;
// }
// struct ListNode* n2 = head;
// struct ListNode* n1 = head;
// int i = 0;
// for (i = 0; i < cnt; i++)
// {
// if (n2->next != NULL)
// {
// n2 = n2->next;
// }
// else
// {
// return n1;
// break;
// }
// }
// while (n2 != NULL)
// {
// n1 = n1->next;
// n2 = n2->next;
// }
// return n1;
//}
//int getDecimalValue(struct ListNode* head)
//{
// int ret = 0;
// // 定义链表指针?作遍历整个链表
// struct ListNode* cur = head;
// // 链表指针不为空时进?循环
// while (cur)
// {
// // 左移?位后将当前值添加?最低位
// ret = (ret << 1) + cur->val;
// // 因为左移操作后最低位为0,任何数与0进?或操作都是不变的所以上式也可以写为
// // ret = (ret << 1) | cur->val;
// // 指针只想下?位数字或者链表结尾
// cur = cur->next;
// }
// // 返回最终得到的数字
// return ret;
//}
//int diagonalSum(int** mat, int matSize, int* matColSize)
//{
// int i = 0;
// // 定义变量存储答案
// int sum = 0;
// // 循环遍历数组
// for (i = 0; i < matSize; i++)
// {
// int j = 0;
// for (j = 0; j < matSize; j++)
// {
// // 判断当前数是否在对?线上
// if (i == j || i + j == matSize - 1)
// {
// // 若在对?线上则将其添加?答案中
// sum += mat[i][j];
// }
// }
// }
// // 返回答案
// return sum;
//}
//int hammingDistance(int x, int y)
//{
// int r = x ^ y;
// int ret = 0;
// while (r)
// {
// ret++;
// r = r & (r - 1);
// }
// return ret;
//}
//int* singleNumber(int* nums, int numsSize, int* returnSize)
//{
// int* ans = (int*)calloc(2, sizeof(int));
// int ret = 0;
// int i = 0;
// // 计算数组中所有数异或起来的结果ret
// for (i = 0; i < numsSize; i++)
// {
// ret ^= nums[i];
// }
//
// // 从低位往?位遍历计算ret的?进制中哪?位是1
// int pos = 0;
// for (i = 0; i < 32; i++)
// {
// if (((ret >> i) & 1) == 1)
// {
// pos = i;
// break;
// }
// }
// // 3. 分组异或
// for (i = 0; i < numsSize; i++)
// {
// // 若当前数pos位为1,作为其中?组对ans[0]进?异或操作
// if (((nums[i] >> pos) & 1) == 1)
// {
// ans[0] ^= nums[i];
// }
// // 否则,作为另?组对ans[1]进?异或操作。
// else
// {
// ans[1] ^= nums[i];
// }
// }
// // ans[1]另?种计算?法
// // ans[1]=ret^ans[0];
//
// // 更新数组长度
// *returnSize = 2;
//
// // 返回答案数组
// return ans;
//}
//uint32_t reverseBits(uint32_t n)
//{
// int i = 0;
// // 定义?个?符号整型ans
// uint32_t ans = 0;
// // 从低位往?位遍历,当i
// for (i = 1; i <= 32; i++)
// {
// // 将原数的第i+1位赋值给ans的第32-(i+1)+1位
// ans |= ((n >> (i - 1)) & 1) << (31 - i + 1);
// }
// // 返回答案
// return ans;
//}
//-----------------------------------------------------------------------------------------
//bool arrayStringsAreEqual(char** word1, int word1Size, char** word2, int word2Size)
//{
// int i = 0;
// char name1[1001] = { 0 };
// char name2[1001] = { 0 };
// for (i = 0; i < word1Size; i++)
// {
// strcat(name1, word1[i]);
// }
// for (i = 0; i < word2Size; i++)
// {
// strcat(name2, word2[i]);
// }
// return (strcmp(name1, name2) == 0);
//}
//
//
//
//bool arrayStringsAreEqual(char** word1, int word1Size, char** word2, int word2Size)
//{
// //定义指向字符串数组的指针指向数组起始位置,并定义两个变量指向两个字符串的字符位置
// int x = 0, y = 0, i = 0, j = 0;
// //同时遍历两个字符串数组
// while (x < word1Size && y < word2Size)
// {
// //?较当前指向的两个字符是否相等
// if (word1[x][i] != word2[y][j])
// {
// //不相等直接返回false
// return false;
// }
// //指向字符的变量后移
// i++;
// //如果指针当前指向空,则遍历下?个字符串,并且重新初始化字符指针
// if (word1[x][i] == '\0')
// {
// x++;
// i = 0;
// }
// //同上
// j++;
// if (word2[y][j] == '\0')
// {
// y++;
// j = 0;
// }
// }
// //若两个字符串遍历同时结束并未发现不相同字符时返回true,否则返回false
// return x == word1Size && y == word2Size;
//}
//
//
//
//bool arrayStringsAreEqual(char** word1, int word1Size, char** word2, int word2Size)
//{
// int i = 0;
// char name1[1001] = { 0 };
// char name2[1001] = { 0 };
// for (i = 0; i < word1Size; i++)
// {
// strcat(name1, word1[i]);
// }
// for (i = 0; i < word2Size; i++)
// {
// strcat(name2, word2[i]);
// }
// return (strcmp(name1, name2) == 0);
//}
//
//
//
//bool arrayStringsAreEqual(char** word1, int word1Size, char** word2, int word2Size)
//{
// //定义指向字符串数组的指针指向数组起始位置,并定义两个变量指向两个字符串的字符位置
// int x = 0, y = 0, i = 0, j = 0;
// //同时遍历两个字符串数组
// while (x < word1Size && y < word2Size)
// {
// //?较当前指向的两个字符是否相等
// if (word1[x][i] != word2[y][j])
// {
// //不相等直接返回false
// return false;
// }
// //指向字符的变量后移
// i++;
// //如果指针当前指向空,则遍历下?个字符串,并且重新初始化字符指针
// if (word1[x][i] == '\0')
// {
// x++;
// i = 0;
// }
// //同上
// j++;
// if (word2[y][j] == '\0')
// {
// y++;
// j = 0;
// }
// }
// //若两个字符串遍历同时结束并未发现不相同字符时返回true,否则返回false
// return x == word1Size && y == word2Size;
//}
//
//
//
////定义qsort函数中的排序参数
//int cmp_int(const void* e1, const void* e2)
//{
// return *(int*)e1 - *(int*)e2;
//}
//int deleteGreatestValue(int** grid, int gridSize, int* gridColSize)
//{
// int i = 0;
// int ans = 0;
// //先对数组每??排序,从?到?和从?到?都可以,只需保证每次删除的数在同?列即可
// for (i = 0; i < gridSize; i++)
// {
// qsort(grid[i], *gridColSize, sizeof(int), cmp_int);
// }
// int j = 0;
// //定义变量,初始化为最?列下标
// int y = *gridColSize - 1;
//
// //求出数组最后?列的最?值,加到ans上,然后y--,遍历每?列
// while (y >= 0)
// {
// int max = grid[0][y];
// //求当前列的最?值
// for (j = 1; j < gridSize; j++)
// {
// if (max < grid[j][y])
// {
// max = grid[j][y];
// }
// }
// //将最?值添加?ans
// ans += max;
// y--;
// }
// //返回答案
// return ans;
//}
//
//
//
//int maximumWealth(int** accounts, int accountsSize, int* accountsColSize)
//{
// int max = 0;
// int i = 0;
// for (i = 0; i < accountsSize; i++)
// {
// int j = 0;
// int tmp = 0;
// for (j = 0; j < *accountsColSize; j++)
// {
// int max = accounts[0][0];
// tmp += accounts[i][j];
// }
// if (max < tmp)
// {
// max = tmp;
// }
// }
// return max;
//}
//
//
//int countDigits(int num)
//{
// int cnt = 0;
// int tmp = num;
// while (tmp)
// {
// if (num % (tmp % 10) == 0)
// {
// cnt++;
// }
// tmp = tmp / 10;
// }
// return cnt;
//}
//
//
//
//int* shuffle(int* nums, int numsSize, int n, int* returnSize)
//{
// int i = 0;
// int* ret = (int*)malloc(2 * n * sizeof(int));
// for (i = 0; i < n; i++)
// {
// ret[2 * i] = nums[i];
// ret[2 * i + 1] = nums[i + n];
// }
// *returnSize = 2 * n;
// return ret;
//}
//
//
//
//int Max(int x, int y) { return x > y ? x : y; }
//int** largestLocal(int** grid, int gridSize, int* gridColSize, int* returnSize,
// int** returnColumnSizes)
//{
// // 使?malloc模拟开辟?个?维数组
// int** ans = malloc((gridSize - 2) * sizeof(int*));
// int i = 0;
// // 为每个?维数组开辟空间
// for (i = 0; i < gridSize - 2; i++) {
// ans[i] = malloc((gridSize - 2) * sizeof(int));
// }
// // 遍历数组并忽略?法取得3×3矩阵的情况
// for (i = 0; i < gridSize - 2; i++) {
// int j = 0;
// for (j = 0; j < gridSize - 2; j++) {
// int x = 0;
// int y = 0;
// // 求得最?值,并将其赋值给ans数组相对应下标的元素
// for (x = i; x <= i + 2; x++) {
// for (y = j; y <= j + 2; y++) {
// ans[i][j] = Max(ans[i][j], grid[x][y]);
// }
// }
// }
// }
//
// // 更新数组长度
// *returnSize = gridSize - 2;
// // 更新数组每?维长度
// *returnColumnSizes = malloc((gridSize - 2) * sizeof(int));
// for (i = 0; i < gridSize - 2; i++) {
// (*returnColumnSizes)[i] = gridSize - 2;
// }
// // 返回?成的矩阵
// return ans;
//}
//}
//
//
//
//bool checkIfPangram(char* sentence)
//{
// // ?于记录字?表中每个字?是否在sentence中出现过,初始化为0
// int exist[26] = { 0 };
// int i = 0;
// // 遍历sentence中的每个字符
// while (*sentence)
// {
// // 将对应字?表中的字?在exist数组中的值设为1
// exist[*sentence - 'a'] = 1;
// sentence++;
// }
// // 遍历exist数组
// for (i = 0; i < 26; i++)
// {
// // 如果存在某个字?在sentence中未出现,则返回false
// if (exist[i] == 0)
// return false;
// }
// // sentence为全字?句,返回true
// return true;
//}
//
//
//
//int numJewelsInStones(char* jewels, char* stones)
//{
// int sum = 0;
// while (*jewels)
// {
// char* tmp = stones;
// while (*tmp)
// {
// if (*jewels == *tmp)
// {
// sum++;
// }
// tmp++;
// }
// jewels++;
// }
// return sum;
//}
//
//
//int numJewelsInStones(char* jewels, char* stones)
//{
// int n = 0;
// //定义?个哈希数组,将英?字?映射到ASCII码表中,其最?值和最?值之差为57。
// bool hash[60] = { 0 };
// //遍历jewels
// while (*jewels)
// {
// //标记jewels中出现的字符
// hash[*jewels - 'A'] = 1;
// jewels++;
// }
// //遍历stones
// while (*stones)
// {
// //判断当前字符是否被标记过
// if (hash[*stones - 'A'])
// n++;
// stones++;
// }
// //返回答案
// return n;
//}
//
//
//// 假设成立时候,flag = -1,返回sum
//// 假设不成立时,flag = 1 ,返回-sum
//int alternateDigitSum(int n)
//{
// int flag = 1;
// int sum = 0;
// while (n)
// {
// sum += flag * (n % 10);
// flag = -flag;
// n = n / 10;
// }
// return -flag * sum;
//}
//
//
//int largestAltitude(int* gain, int gainSize)
//{
// int i = 0;
// //定义?个变量m记录最?海拔,并初始化为第?个点的海拔
// int m = gain[0];
// for (i = 1; i < gainSize; i++)
// {
// //更新gain数组当前元素为当前的前缀和
// gain[i] += gain[i - 1];
// //更新m为当前最?海拔
// if (gain[i] > m)
// {
// m = gain[i];
// }
// }
// //特判若所有点的海拔都低于初始值,则更新m为0
// if (m < 0)
// {
// m = 0;
// }
// //返回最?海拔
// return m;
//}
//
//
//int subtractProductAndSum(int n)
//{
// int sum1 = 0;
// int sum2 = 1;
// while (n)
// {
// sum1 += (n % 10);
// sum2 *= (n % 10);
// n = n / 10;
// }
// return sum2 - sum1;
//}
//int countConsistentStrings(char* allowed, char** words, int wordsSize) {
// int i = 0;
// int count = 0;
// //遍历words数组
// for (i = 0; i < wordsSize; i++) {
// int j = 0;
// //假定全部出现
// int flag = 1;
// //遍历每?个字符
// while (words[i][j]) {
// if (NULL == strchr(allowed, words[i][j])) {
// //有字符没出现
// flag = 0;
// break;
// }
// j++;
// }
// //更新计数器的值
// count += flag;
// }
// //返回计数器的值
// return count;
//}
//char* reverseLeftWords(char* s, int k)
//{
// int i = 0;
// int len = strlen(s);
// for (i = 0; i < k; i++)
// {
// //定义变量记录收个字符
// char tmp = s[0];
// int j = 0;
// //所有字符左移⼀位
// for (j = 0; j < len - 1; j++)
// {
// s[j] = s[j + 1];
// }
// //将tmp添加⾄末尾
// s[len - 1] = tmp;
// }
// //返回更新后的字符串
// return s;
//}
//char* dynamicPassword(char* password, int target)
//{
// int i = 0;
// int len = strlen(password);
// for (i = 0; i < target; i++)
// {
// char tmp = password[0];
// int j = 0;
// for (j = 0; j < len - 1; j++)
// {
// password[j] = password[j + 1];
// }
// password[len - 1] = tmp;
// }
// return password;
//}
//
//
//
//void reverse(char* left, char* right)
//{
// //反转两个指针之间的内容
// while (left < right)
// {
// //交换两个指针指向的的内容
// char tmp = *left;
// *left = *right;
// *right = tmp;
// //两个指针向对⽅靠拢,继续进⾏交换
// left++;
// right--;
// }
//}
//char* reverseLeftWords(char* s, int k)
//{
// //定义变量⽤来记录字符串⻓度
// int len = strlen(s);
// //第⼀次反转
// reverse(s, s + k - 1);
// //第⼆次反转
// reverse(s + k, s + len - 1);
// //整体反转
// reverse(s, s + len - 1);
// //返回反转后的字符串
// return s;
//}
//int* decode(int* encoded, int encodedSize, int first, int* returnSize)
//{
// //a^b = c
// //c^a --> a^b^a = b
// //定义arr数组并分配内存
// int* arr = (int*)malloc((encodedSize + 1) * sizeof(int));
// //为arr数组第⼀个元素赋值
// arr[0] = first;
// int i = 0;
// //为arr数组元素依次赋值
// for (i = 1; i < encodedSize + 1; i++)
// {
// arr[i] = encoded[i - 1] ^ arr[i - 1];
// }
// //更新数组⻓度并返回数组
// *returnSize = encodedSize + 1;
// return arr;
//}
//int numIdenticalPairs(int* nums, int numsSize)
//{
// int sum = 0;
// int i = 0;
// for (i = 0; i < numsSize; i++)
// {
// for (int j = i + 1; j < numsSize; j++)
// {
// if (nums[i] == nums[j])
// {
// sum++;
// }
// }
// }
// return sum;
//}
//
//
//int numIdenticalPairs(int* nums, int numsSize)
//{
// int i = 0;
// //计数器
// int cnt = 0;
// //定义哈希表
// int* arr = (int*)malloc((101) * sizeof(int));
// // 将每个元素赋值为 0
// for (int i = 1; i < 101; i++)
// {
// arr[i] = 0;
// }
//
// //遍历数组
// for (i = 0; i < numsSize; i++)
// {
// //计数器加上当前元素在数组前⾯位置中出现的次数,并令出现的次数加⼀
// cnt += arr[nums[i]]++;
// }
// ////释放哈希表内存
// free(arr);
// //返回计数器
// return cnt;
//}
//bool* kidsWithCandies(int* candies, int candiesSize, int extraCandies, int* returnSize)
//{
// int i = 0;
// bool* nums = (bool*)malloc(candiesSize * sizeof(bool));
// for (i = 0; i < candiesSize; i++)
// {
// int ret = candies[i] + extraCandies;
// int j = 0;
// int flag = 0;
// for (j = 0; j < candiesSize; j++)
// {
// if (ret < candies[j])
// {
// flag = 1;
// }
// }
// if (flag == 1)
// {
// nums[i] = false;
// }
// else
// {
// nums[i] = true;
// }
// }
// *returnSize = candiesSize;
// return nums;
//}
//char repeatedCharacter(char* s)
//{
// // 定义哈希数组
// bool arr[26] = { 0 };
// // 遍历字符串
// while (*s)
// {
// // 检查当前字⺟是否被标记过,若被标记则直接返回当前字⺟
// if (arr[*s - 'a'] == 1)
// {
// return *s;
// }
// // 否则标记当前字⺟
// arr[*s - 'a'] = 1;
// s++;
// }
// // 返回任意⼀个字符,防⽌编译错误
// return ' ';
//}
//}
//int countAsterisks(char* s)
//{
// int count = 0;
// int flag = 0;
// while (*s)
// {
// if (*s == '|')
// {
// flag = !flag;
// }
// if (flag == 1)
// {
// // 在两个 | 之间
// s++;
// continue;
// }
// if (*s == '*')
// {
// count++;
// }
// s++;
// }
// return count;
//}
//int* getConcatenation(int* nums, int numsSize, int* returnSize)
//{
// int* newnums = (int*)malloc(2 * numsSize * sizeof(int));
// *returnSize = 2 * numsSize;
// int i = 0;
// for (i = 0; i < numsSize; i++)
// {
// newnums[i] = nums[i];
// }
// for (i = 0; i < numsSize; i++)
// {
// newnums[i + numsSize] = nums[i];
// }
// return newnums;
//}
//int* leftRigthDifference(int* nums, int numsSize, int* returnSize)
//{
// // 定义前缀和与后缀和数组
// int leftSum[numsSize];
// int rightSum[numsSize];
// // 初始化前缀和数组的⾸位和后缀和数组的末位
// leftSum[0] = rightSum[numsSize - 1] = 0;
// int i = 0;
// // 定义ans数组
// int* answer = (int*)malloc(numsSize * sizeof(int));
//
// // 为前缀和数组与后缀和数组赋值
// for (i = 1; i < numsSize; i++)
// {
// leftSum[i] = leftSum[i - 1] + nums[i - 1];
// // 后缀和数组⼀定要先为后⾯的元素赋值
// rightSum[numsSize - i - 1] =
// rightSum[numsSize - i] + nums[numsSize - i];
// }
// // 求出ans数组
// for (i = 0; i < numsSize; i++)
// {
// answer[i] = abs(leftSum[i] - rightSum[i]);
// }
// // 更新数组⻓度后返回数组
// *returnSize = numsSize;
// return answer;
//}
//// 方法一:超出时间限制
//int sum(int n)
//{
// //基本情况,需要终⽌递归,1~1的所有数的和为1本⾝,直接返回1
// if (n == 1) return 1;
// //否则返回1~n-1所有数的和加上n本⾝,即1~n所有数的和
// return n + sum(n - 1);
//}
//int main() {
// //假设n为5,求得1~5之间所有数的和
// printf("%d", sum(5));
//}
//
//
//// 方法二:递归方法优化,记忆路线
////递归时间复杂度⾼
//int climb(int x) {
// //若x为1或2,则返回x(⾛到第⼀阶台阶的⽅法数为1,⾛到第⼆阶台阶的⽅法数为2)
// if (x <= 2) return x;
// //返回从第⼀阶台阶⾛到第x-1阶和第x-2阶台阶的⽅法数的和
// return climb(x - 1) + climb(x - 2);
//}
//int climbStairs(int n) {
// //返回从第⼀阶台阶⾛到第n阶台阶的⽅法数
// return climb(n);
//}
//
//
//// 方法三:动态规划
////定义全局变量数组,⽤来记忆化搜索
//int mem[50];
////定义递归函数
//int climb(int x) {
// //若参数⼩于等于2,则返回参数本⾝
// if (x <= 2) return x;
// //若函数值已经被计算过,则返回这个值
// if (mem[x] != -1) return mem[x];
// //否则计算这个函数值并返回
// return mem[x] = climb(x - 1) + climb(x - 2);
//}
//int climbStairs(int n) {
// int i = 0;
// //初始化记忆数组
// for (i = 1; i <= n; i++) mem[i] = -1;
// //返回从第⼀阶台阶⾛到第n阶台阶的⽅法数
// return climb(n);
//}
//
//
//
//int climbStairs(int n) {
// //定义数组⽤来记录每⼀个位置的元素值
// int climb[50];
// //初始化前两个位置的元素值
// climb[1] = 1;
// climb[2] = 2;
// int i = 0;
// //遍历求得每个位置的元素值
// for (i = 3; i <= n; i++) climb[i] = climb[i - 1] + climb[i - 2];
// //返回第n个位置的元素值,即从第⼀阶台阶⾛到第n阶台阶的⽅法数
// return climb[n];
//}
//
//// 方法四:动态规划空间优化
////递归时间复杂度⾼
//int climbStairs(int n) {
// //特判n⼩于等于2的情况
// if (n <= 2)
// return n;
// else {
// //定义三个变量就三个位置的元素值
// int a = 1;
// int b = 2;
// int c = 0;
// //进⾏n-2次操作
// while (n > 2) {
// //将a和b的和赋值给c,然后将b的值赋值给a,将c的值赋值给b
// c = a + b;
// a = b;
// b = c;
// n--;
// }
// //返回c的值
// return c;
// }
//}
//int hammingWeight(uint32_t n)
//{
// int i = 0;
// int cnt = 0;
// for (i = 0; i < 32; i++)
// {
// if (((n >> i) & 1) == 1)
// {
// cnt++;
// }
// }
// return cnt;
//}
//// int hammingWeight(uint32_t n) {
//// int cnt = 0;
//// while(n) {
//// //最低位为1表⽰n为奇数
//// if(n%2 == 1) //if((n&1)==1)
//// cnt++;
////
//// //右移操作相当于除以2
//// n/=2; //n>>=1
//// }
//// return cnt;
//// }
//
//
//int hammingWeight(uint32_t n)
//{
// //定义变量作为计数器
// int cnt = 0;
// //计算n的⼆进制形式中1的个数
// while (n)
// {
// n = n & (n - 1);
// cnt++;
// }
// //返回答案
// return cnt;
//}
//int* leftRightDifference(int* nums, int numsSize, int* returnSize)
//{
// int* ans = (int*)malloc(numsSize * sizeof(int));
// int* leftSum = (int*)calloc(numsSize, sizeof(int));
// int* rightSum = (int*)calloc(numsSize, sizeof(int));
//
// // 计算 leftSum
// for (int i = 1; i < numsSize; i++) {
// leftSum[i] = leftSum[i - 1] + nums[i - 1];
// }
//
// // 计算 rightSum
// for (int i = numsSize - 2; i >= 0; i--) {
// rightSum[i] = rightSum[i + 1] + nums[i + 1];
// }
//
// // 计算答案
// for (int i = 0; i < numsSize; i++) {
// ans[i] = abs(leftSum[i] - rightSum[i]);
// }
//
// free(leftSum);
// free(rightSum);
//
// *returnSize = numsSize;
// return ans;
//}
//int search(int* nums, int numsSize, int target)
//{
// int left = 0;
// int right = numsSize - 1;
// while (left <= right)
// {
// int mid = (left + right) / 2;
// if (target > nums[mid])
// {
// left = mid + 1;
// }
// else if (target < nums[mid])
// {
// right = mid - 1;
// }
// else
// {
// return mid;
// }
// }
// return -1;
//}
//int removeDuplicates(int* nums, int numsSize)
//{
// int fast = 1;
// int slow = 1;
// while (fast <= numsSize - 1)
// {
// if (nums[fast] != nums[fast - 1])
// {
// nums[slow] = nums[fast];
// slow++;
// }
// fast++;
// }
// return slow;
//}
//bool searchMatrix(int** matrix, int matrixSize, int matrixColSize, int target)
//{
// int i = 0;
// for (i = 0; i < matrixSize; i++)
// {
// int j = 0;
// for (j = 0; j < matrixColSize; j++)
// {
// if (target == matrix[i][j])
// {
// return true;
// }
// }
// }
// return false;
//}
//int singleNumber(int* nums, int numsSize) {
// int i = 0;
// int ret = 0;
// //将每个数异或起来
// for (i = 0; i < numsSize; i++) {
// ret ^= nums[i];
// }
// return ret;
// //nums[i]^=nums[i-1];
// //return nums[numsSize-1];
//}
//void reverseString(char* s, int sSize)
//{
// // 双指针的方法
// int left = 0;
// int right = sSize - 1;
// while (left <= right)
// {
// char tmp = s[left];
// s[left] = s[right];
// s[right] = tmp;
// left++;
// right--;
// }
// return s;
//}
//
//void reverseString(char* s, int sSize)
//{
// char* left = s;
// char* right = s + sSize - 1;
// while (left <= right)
// {
// char tmp = *left;
// *left = *right;
// *right = tmp;
// left++;
// right--;
// }
//}
//int firstUniqChar(char* s)
//{
// int arr[256] = { 0 };
// char* str = s;
// while (*str)
// {
// arr[*str++]++;
// }
// str = s;
// while (*str)
// {
// if (arr[*str] == 1)
// {
// return str - s;
// }
// str++;
// }
// return -1;
//}
//int findCenter(int** edges, int edgesSize, int* edgesColSize)
//{
// //依次判断等式是否成⽴
// if (edges[0][0] == edges[1][0]) return edges[0][0];
// if (edges[0][0] == edges[1][1]) return edges[0][0];
// if (edges[0][1] == edges[1][0]) return edges[0][1];
// if (edges[0][1] == edges[1][1]) return edges[0][1];
// //防⽌编译错误
// return 0;
//}
//int maxProductDifference(int* nums, int numsSize)
//{
// // 先进行冒泡排序然后直接加减即可
// int i = 0;
// for (i = 0; i < numsSize - 1; i++)
// {
// int j = 0;
// for (j = 0; j < numsSize - 1 - i; j++)
// {
// if (nums[j] > nums[j + 1])
// {
// int tmp = nums[j];
// nums[j] = nums[j + 1];
// nums[j + 1] = tmp;
// }
// }
// }
// return (nums[numsSize - 1] * nums[numsSize - 2]) - (nums[0] * nums[1]);
//}
//int** generate(int numRows, int* returnSize, int** returnColumnSizes)
//{
// int i = 0;
// //开辟存放杨辉三⻆的⼆维数组
// int** arr = (int**)malloc(numRows * sizeof(int*));
// //为每⼀维分配内存
// for (i = 0; i < numRows; i++) {
// arr[i] = (int*)malloc(numRows * sizeof(int));
// }
// //更新⾏数
// *returnSize = numRows;
// //存放每⼀⾏数据的个数
// *returnColumnSizes = (int*)malloc(numRows * sizeof(int));
//
// //按⾏从上到下遍历
// for (i = 0; i < numRows; i++) {
// int j = 0;
// //更新每⼀⾏的元素个数
// (*returnColumnSizes)[i] = i + 1;
// //初始化每⼀⾏的⾸位和末位元素为1
// arr[i][0] = arr[i][i] = 1;
//
// //更新中间元素,遍历前两维时不会进⼊循环,不需要特判
// for (j = 1; j < i; j++) {
// arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
// }
// }
// //返回杨辉三⻆
// return arr;
//}
//char* pathEncryption(char* path)
//{
// int len = strlen(path);
// int left = 0;
// while (left != len)
// {
// if (path[left] == '.')
// {
// path[left] = ' ';
// }
// else
// {
// left++;
// }
// }
// return path;
//}
//int addDigits(int num)
//{
// while (num > 9)
// {
// //证明还是两位数
// int sum = 0;
// while (num)
// {
// sum += num % 10;
// num /= 10;
// }
// num = sum;
// }
// return num;
//}
//int* sortArrayByParity(int* nums, int numsSize, int* returnSize)
//{
// //定义双指针
// int l = 0;
// int r = numsSize - 1;
// //当两指针还未相遇时查找奇数在前的情况
// while (l < r)
// {
// //查找最左边的奇数
// while ((l < r) && nums[l] % 2 == 0)
// {
// l++;
// }
// //查找最右边的偶数
// while ((l < r) && nums[r] % 2 == 1)
// {
// r--;
// }
// //若两指针未相遇进⾏交换
// if (l < r) {
// int tmp = nums[l];
// nums[l] = nums[r];
// nums[r] = tmp;
// //交换后两指针相向移动继续查找
// l++;
// r--;
// }
// }
// //更新数组⻓度后返回更新后的数组
// *returnSize = numsSize;
// return nums;
//}
//int balancedStringSplit(char* s)
//{
// //定义变量作为平衡字符串计数器
// int cnt = 0;
// //定义两个变量作为字符'L'和'R'的计数器
// int rc = 0;
// int lc = 0;
// //遍历字符串
// while (*s)
// {
// //更新字符串计数
// if (*s == 'R')
// rc++;
// else if (*s == 'L')
// lc++;
// //若两个字符计数器的值相等,则以上⼀个字符结尾+1作为起点,当前字符作为结尾满⾜平衡
// if (rc == lc)
// cnt++;
// s++;
// }
// return cnt;
//}
//int countKDifference(int* nums, int numsSize, int k)
//{
// int i = 0;
// int sum = 0;
// for (i = 0; i < numsSize; i++)
// {
// int j = 0;
// for (j = i; j < numsSize; j++)
// {
// if (k == abs(nums[i] - nums[j]))
// {
// sum++;
// }
// }
// }
// return sum;
//}
//int* countNumbers(int cnt, int* returnSize)
//{
// int sz = pow(10, cnt) - 1;
// int* nums = (int*)malloc(sz * sizeof(int));
// for (int i = 0; i < sz; i++)
// {
// nums[i] = i + 1;
// }
// *returnSize = sz;
// return nums;
//}
//char* generateTheString(int n)
//{
// //开辟⼀个⻓度为n+1的数组ans
// char* ans = malloc((n + 1) * sizeof(char));
// //初始化数组
// memset(ans, 'a', n);
// ans[n] = '\0';
//
// //如果n位偶数,将第⼀个改为'b',a和b都是奇数个
// if (n % 2 == 0)
// ans[0] = 'b';
// //返回字符串ans
// return ans;
//}
//int* replaceElements(int* arr, int arrSize, int* returnSize)
//{
// int max = -1;
// for (int i = arrSize - 1; i >= 0; i--)
// {
// int temp = arr[i];
// arr[i] = max;
// if (max < temp) max = temp;
// }
// *returnSize = arrSize;
// return arr;
//}
//char* mergeAlternately(char* word1, char* word2) {
// int flag = 1;
// //定义⻓度⼤于等于两个字符串⻓度之和的字符串
// char* ans = calloc(201, sizeof(char));
// int i = 0;
// //遍历两字符串
// while (*word1 && *word2) {
// //判断上⼀次合并的是哪个字符串,进⾏交替合并
// if (flag == 1) {
// ans[i++] = *word1++;
// flag = 0;
// }
// else {
// ans[i++] = *word2++;
// flag = 1;
// }
// }
// //如果word1先结束,将word2剩余的内容合并
// if (*word1 == '\0') {
// while (*word2) {
// ans[i++] = *word2++;
// }
// }
// //如果word2先结束,将word1剩余的内容合并
// else {
// while (*word1) {
// ans[i++] = *word1++;
// }
// }
// //返回拼接后的字符串
// return ans;
//}
////定义⽐较函数
//int cmp(const void* e1, const void* e2)
//{
// return *(int*)e1 - *(int*)e2;
//}
//void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
//{
// int i = 0;
// //将nums2数组中的内容全部追加到nums1中
// for (i = 0; i < n; i++)
// {
// nums1[m + i] = nums2[i];
// }
// //将数组升序排序
// qsort(nums1, nums1Size, sizeof(int), cmp);
//}
//
//
//void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
// //定义双指针分别指向nums1数组和nums2数组中的元素
// int p1 = 0, p2 = 0;
// //定义⼀个⻓度为n+m的新数组
// int* sorted = malloc((n + m) * sizeof(int));
//
// //当两指针都没有指向空时,进⼊循环将较⼩的元素存⼊sorted数组末位,并将相应指针后移
// while (p1 < m && p2 < n) {
// if (nums1[p1] < nums2[p2]) {
// sorted[p1 + p2 - 1] = nums1[p1++];
// }
// else {
// sorted[p1 + p2 - 1] = nums2[p2++];
// }
// }
//
// //判断是否p1指针还有剩余
// if (p1 < m) {
// while (p1 < m) sorted[p1++ + n] = nums1[p1];
// }
// //否则p2指针还有剩余
// else {
// while (p2 < n) sorted[m + p2++] = nums2[p2];
// }
// int i;
// //将合并后并排序的数组元素依次赋值给nums1数组
// for (i = 0; i != m + n; ++i) {
// nums1[i] = sorted[i];
// }
//}
//int heightChecker(int* heights, int heightsSize)
//{
// // 先用冒泡排序
// int i = 0;
// int* tmp = (int*)malloc(heightsSize * sizeof(int));
// memcpy(tmp, heights, heightsSize * sizeof(int));
// int sum = 0;
// for (i = 0; i < heightsSize - 1; i++)
// {
// int j = 0;
// for (j = 0; j < heightsSize - 1 - i; j++)
// {
// if (heights[j] > heights[j + 1])
// {
// int tmp = heights[j];
// heights[j] = heights[j + 1];
// heights[j + 1] = tmp;
// }
// }
// }
// for (i = 0; i < heightsSize; i++)
// {
// if (heights[i] != tmp[i])
// {
// sum++;
// }
// }
// return sum;
//}
//int* targetIndices(int* nums, int numsSize, int target, int* returnSize)
//{
// int i = 0;
// for (i = 0; i < numsSize - 1; i++){
// int j = 0;
// for (j = 0; j < numsSize - 1 - i; j++)
// {
// if (nums[j] > nums[j + 1])
// {
// int tmp = nums[j];
// nums[j] = nums[j + 1];
// nums[j + 1] = tmp;
// }
// }
// }
// int cnt = 0;
// for (int i = 0; i < numsSize; i++){
// if (nums[i] == target)
// cnt++;
// }
// int* ret = (int*)malloc(cnt * sizeof(int));
// int sum = 0;
// int k = 0;
// for (i = 0; i < numsSize; i++){
// if (nums[i] == target){
// ret[k++] = i;
// }
// }
// *returnSize = cnt;
// return ret;
//}
//typedef struct ListNode
//{
// int val;
// struct ListNode* next;
//}ListNode;
//struct ListNode* reverseList(struct ListNode* head) {
// //定义两个指针⽤作反转
// struct ListNode* cur = head;
// struct ListNode* prev = NULL;
//
// //当cur不为空时,代表链表还存在未反转的节点
// while (cur) {
// //定义指针指向指针cur的下⼀个节点避免链表断裂
// struct ListNode* next_node = cur->next;
// //实现反转操作
// cur->next = prev;
// //更新两个指针以便下⼀次迭代
// prev = cur;
// cur = next_node;
// }
//
// //将头指针指向指针prev指向的节点,完成反转
// head = prev;
// //返回头指针
// return head;
//}
//typedef struct ListNode
//{
// int val;
// struct ListNode* next;
//}ListNode;
//struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
// //定义⼀个哑节点作为结果链表的头
// struct ListNode* dummy = (struct ListNode*)malloc(sizeof(struct ListNode));
// dummy->val = 0;
// dummy->next = NULL;
// //定义结果链表的尾,刚开始头尾相同
// struct ListNode* curr = dummy;
// //循环⽐较两个链表的头节点
// while (l1 && l2) {
// //将较⼩的节点接⼊结果链表中,并将该节点从原链表中删除
// if (l1->val < l2->val) {
// curr->next = l1;
// l1 = l1->next;
// }
// else {
// curr->next = l2;
// l2 = l2->next;
// }
// //尾部后移
// curr = curr->next;
// }
//
// //其中⼀个链表为空,将另⼀个链表的剩余节点全部接⼊结果链表
// if (l1) {
// curr->next = l1;
// }
// else {
// curr->next = l2;
// }
// //返回哑节点dummy的next指针
// return dummy->next;
//}
转载自CSDN-专业IT技术社区
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/2201_75587702/article/details/149729867