1.字符串逆序
写一个函数,可以逆序一个字符串的内容。
#include<stdio.h>
void reverse(char* str,int len)
{
char *left = &str[0];//左下标值
char *right = &str[len - 1];//右下标值
while(left<right)
{
char tmp = *left;
*left = *right;
*right = tmp;
right--;//最右边值-1,开始找第二个右边的值
left++;//最左边的值+1,找第二个左边值,依次循环
}
}
void print(char*str,int len)
{
int i = 0;
for (; i < len;i++)
{
printf("%c", str[i]);
}
}
int main()
{
char arr[] = "I am a student";
int len = sizeof(arr) / sizeof(arr[0]);
reverse(arr, len);
print(arr, len);
return 0;
}
代码运行
2.strlen实现
模拟实现库函数strlen
首先strlen是一个库函数他可以求得字符的长度,我们可以自定义一个函数进行遍历然后求得数组中的字符长度
#include<stdio.h>
int My_strlen(const char* str)
{
const char *s = str;//元首首地址
int count = 0;
while (*s)//while到‘\0‘会跳出循环
{
count++;//字符个数
s++;//s++找下一个字符;
}
// return count;//返回值
return s - str;
}
int main()
{
char str[] = "abcdefg";
int ret = My_strlen(str);
printf("%d", ret);
return 0;
}
3.调整奇数偶数顺序
调整数组使奇数全部都位于偶数前面
题目:
输入一个整数数组,实现一个函数,
来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,
所有偶数位于数组的后半部分。
#include<stdio.h>
void reverse(int* str,int sz)
{
int left = 0;
int right = sz - 1;//元素-1为下标最后一个元素
while(left<right)//left<right,left++right--直到两个值相等循环结束
{
//这里是我们的循环的次数
while(left<right&&str[left]%2!=0)//说明它为奇数,这里left<right条件防止越界
{
left++; // left++;因为奇数本身就是在左边我们只需要找偶数,不是的话就不用更改
}
while(left<right&&str[right]%2==0)//偶数
{
right--;//这里从右往左减防止越界
}
//我们的left和right没有循环的值来到了这里,我们需要交换一下
str[left] ^= str[right];
str[right] ^= str[left];
str[left] ^= str[right];
}
}
void print(int* str,int len)
{
for (int i = 0; i < len;i++)
{
printf("%d ", *(str + i));//取地址简引用str取的是首元素的地址+第i个,进行简引用
}
}
int main()
{
//定义一个下标left为0寻找左边奇数,遇到偶数跳出
//定义一个下标right为偶数寻找右边偶数,遇到奇数跳出
//给跳出的值进行互换
int str[] = {1,1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int sz = sizeof(str) / sizeof(str[0]);
reverse(str, sz);
print(str, sz);//打印
return 0;
}
4.使用指针打印数组内容
写一个函数打印arr数组的内容,不使用数组下标,使用指针。
arr是一个整形一维数组。
#include<stdio.h>
int main()
{
const int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int const *p = arr;
int len = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < len; i++)
{
printf("%d ", p[i]);
}
return 0;
}
5.字符串旋转结果
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
#include<stdio.h>
#include<string.h>
//库方法1:
// s1 =AABCD s2 = BCDAA
char* Func(char* s1,char* find)
{
char tmp[1000] = {0};
strcpy(tmp, s1);//拷贝s1到tmp
strcat(tmp, s1);//拼接s1到tmp
// strstr的为arr1中寻找arr2,如果可以找到arr2中的元素则返回arr1中arr2开始的第第一个元素往后
// 如果arr1中没有,找不到字符则返回(null)
return strstr(tmp, find);//两个拼接好后可以找到BCDAA
//如果为int类型的话返回结果为0或者1所以我们return修改为不可以为NULL
}
int main()
{
char* arr1 = "AABCD";
char* arr2 = "BCDAA";
char* ret = Func(arr1, arr2);
if(ret!=NULL)
{
printf("找到了");
}
else
{
printf("没找到了");
}
return 0;
}
方法2:
#include<stdio.h>
#include<string.h>
//使用库方法2:
int FindRound(char* str,char* find)
{
int len=strlen(str);
int i = 0, j = 0;
for (; i < len;i++)
{
char tmp = str[0];
for (j = 0; j < len - 1;j++)//len-1不会越界因为我们后续的代码需要j+1
{
str[j] = str[j + 1];
}
str[j] = tmp;
//没挪动一次就判断一下当前的str是否是find
if(strcmp(str,find)==0)//判断字符串相等
{
return 1;
}
}
return 0;
}
int main()
{
char arr1[] = "AABCD";
char arr2[] = "BCDAA";
int ret = FindRound(arr1, arr2);//不使用库方法
printf("%d", ret);
return 0;
}
6.杨辉三角
在屏幕上打印杨辉三角。
1
1 1
1 2 1
1 3 3 1
杨辉三角规律为左上方和右上方的和
#include<stdio.h>
int main()
{
int arr[101][101] = {0};
int n;//为打印第几次杨辉三角
scanf("%d", &n);
for (int i = 0; i < n;i++)//行
{
for (int j = 0; j <= i;j++)//列第一行一列第二行二列。。。
{
if (j == 0||i==j)//0列改为1,因为最左边的数和最右边为1
{
arr[i][j] = 1;
}
else
{
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];//左边第一个数和第二个数的和
}
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
7.杨式矩阵
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
要求:时间复杂度小于O(N);
#include<stdio.h>
int Func(int str[][3],int x,int y,int find)
{
int i = 0;//从第0行的下标开始
int j = y - 1;//从第y-1为最后一列找
//因为题目中的要求已经给到了,时间的复杂度小于O(N),要小于数组中的元素个数
//我们可以直接由第0行开始由最后一列进行排除
while (i < x && y >= 0)//i最大为x,y最小为0,这样才能进入循环
{
if(str[i][j]<find)
{
i++;//小于说明这一行没有,换到下一行
}
else if(str[i][j]>find)
{
j--;//比find大要缩写范围
}
else
{
return 1;//找到了
}
}
return 0;
}
int main()
{
int arr[][3] = {{1, 2, 3},{4, 5, 6},{7, 8, 9}};
int ret = Func(arr,3,3,10);
printf("%d", ret);
return 0;
}
8.猜凶手
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
以下为4个嫌疑犯的供词:
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
void FindMurder()
{
char killer = 'A';
for (; killer <= 'D';killer++)//有四个人ABCD
{
if((killer!='A')+(killer=='C')+(killer=='D')+(killer!='D')==3)
//将四个人带入,满足四个条件就是凶手
{
printf("找到了凶手是%c\n", killer);
}
}
}
int main()
{
FindMurder();
return 0;
}
9.转移表
转移表代码实践
#include<stdio.h>
void menu()
{
printf("******* 1.Add 2.Sub ********\n");
printf("******* 3.Mult 4.Div ********\n");
printf("******* 0.exit ********\n");
printf("***********************************\n");
}
int Add(int x,int y)//Add加法运算
{
return x + y;
}
int Sub(int x,int y)// Subtraction减法运算
{
return x - y;
}
int Mult(int x,int y)//Multiple 乘法运算
{
return x * y;
}
int Div(int x,int y)//Division 除法运算
{
return x / y;
}
int main()
{
int input,x,y;
int ret = 0;//将结果放到ret中
int (*Parr[5])(int x, int y) = {0, Add, Sub, Mult, Div}; // 一共四个选项,0为下标
// 函数指针将四个函数以数组的形式存储到parr中
do
{
menu();
printf("Please Your select>>>>");
scanf("%d", &input);
if (input > 0 && input <= 4)
{
printf("Input operand>>>");
scanf("%d %d", &x, &y);
int ret = (*Parr[input])(x, y);//指向input
printf("%d\n",ret);
}
else if(input==0)
{
printf("exiting\n");
}
else
{
printf("Please Choose over again\n");
}
} while (input);
return 0;
}
10.找单身狗2
公式1:
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
编写一个函数找出这两个只出现一次的数字。
例如:
有数组的元素是:1,2,3,4,5,1,2,3,4,6
只有5和6只出现1次,要找出5和6.
#include<stdio.h>
void Find_sort(int* arr,int len)
{
int i = 0, j = 0;
for (i=0; i < len; i++)
{
for (j = 0; j < len-i-1;j++)
{
if(arr[j]>arr[j+1])
{
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
//按顺序排序
}
}
}
}
void Find_single(int *arr, int len,int* sum)
{
Find_sort(arr, len);
int i = 0;
int j = 0;
for (int i = 0; i < len;)
{
if(arr[i]==arr[i+1])
{
i += 2; // 开始第二组遍历
}
else
{
sum[j] = arr[i];
j++;//存储后换到第二个下标进行存储
i++;//进行下一次循环判断
}
}
}
int main()
{
int arr[] = {1, 2, 3, 4, 5, 1, 2, 3, 4, 6};
int sum[101] = {0};//储存arr中一共有几个不同的元素
int len = sizeof(arr) / sizeof(arr[0]);
Find_single(arr, len,sum);
printf("%d %d", sum[0], sum[1]);
return 0;
}
公式2:
#include<stdio.h>
void Find_single(int* arr,int len,int* num1,int* num2)
{
int ret = 0;
int k;
for (int i = 0; i < len;i++)
{
ret ^= arr[i];
}
for (int i = 0; i < 32;i++)//将ret32位二进制数循环出来
{
if((ret>>i)&1)//为1进入条件,^的结果不同为1
{
k = i;
break;
}
}
*num1 = 0, *num2 = 0;
for (int i = 0; i < len;i++)
{
if(arr[i]>>k&1)
*num1 ^= arr[i];
else
*num2 ^= arr[i];
}
}
int main()
{
int arr[] = {1, 2, 3, 4, 5, 1, 2, 3, 5, 6};
int len = sizeof(arr) / sizeof(arr[0]);
int num1 = 0, num2 = 0;
Find_single(arr, len, &num1, &num2);
printf("%d %d", num1, num2);
return 0;
}
太晚了。。。。明天再更新。。。。。。。。。。。。。