4徐汇区网站建设,网站策划总结,房产系统平台,徐州地产开发公司招聘1.找凶手问题#xff1a;
//题目名称#xff1a; //猜凶手 //题目内容#xff1a; //日本某地发生了一件谋杀案#xff0c;警察通过排查确定凶手必为4个嫌疑犯的一个。 //以下为4个嫌疑犯的供词#xff1a; //A说#xff1a;不是我 //B说#xff1a;是C //C说#xff…1.找凶手问题
//题目名称 //猜凶手 //题目内容 //日本某地发生了一件谋杀案警察通过排查确定凶手必为4个嫌疑犯的一个。 //以下为4个嫌疑犯的供词 //A说不是我 //B说是C //C说是D //D说C在胡说 //已知3个人说的是真话1个人说的是假话。 //请根据这些信息写一个程序来确定到底谁是凶手 代码实现
#includeStdio.h int main() { char killer 0; for(killer a;killerd;killer)//循环将每个人都假设为一次凶手 { if((killer!a) (killerc) (killerd) (killer!d) 3 )//有三个人说了真话一个人说了假话那么四句话加起来的结果应该是3解题关键 { printf(killer %c\n,killer);//只有c满足以上条件所以只有c是凶手 } } } 2.定名次
//解题思路穷举法列出每一种可能后再筛选 #includestdio.h int main() { int a 0; int b 0; int c 0; int d 0; int e 0; for(a 1;a5;a) { for(b 1;b 5;b) { for(c 1;c5;c) { for(d 1;d5;d) { for(e 1;e5;e) { if((b2)(a3)1(b2)(e4)1(c1)(d2)1(c5)(d3)1(e4)(a1)1)//每个人的话都有一半是真的所以每个人的两句话变为条件加起来的结果是1且5个人的话都要实现 { if(a*b*c*d*e120)//必须满足5个人的名次的乘积为120否则就出现并列的情况不符合题目条件 { printf(a%d b%d c%d d%d e%d\n,a,b,c,d,e); } } } } } } } }
3.字符串旋转
//【题目名称】
//字符串左旋
//【题目内容】
//实现一个函数可以左旋字符串中的k个字符。
//例如
//ABCD左旋一个字符得到BCDA
//ABCD左旋两个字符得到CDAB
//方法1暴力解题法//解题思路假设字符串为abcdef,要实现1个左旋则先把a提出来放到临时变量中再把剩下的字符往前移动1个位置最后再把最后一个字符的位置放上a //左旋2个3个则依此类推
/*#includestdio.h #includestring.h char* is_left_move(char*str,int k,int sz) { int i 0; char tmp 0; for(i0;ik;i)//k等于几就说明要进行几次移位 { int j 0; tmp *str;//字符串的首字符每次移位后都不一样所以要放在循环外面 for(j0;jsz-1;j) { str[j] str[j1];//第一个字符取出其余字符向前移动1位 } j--;//最后一次循环结束时i这次时多余的如果不减去则str[j1]就变成了str[4],越界了 str[j1] tmp; } return str; } int main() { char arr[] ABCD; int k 0; int sz strlen(arr); scanf(%d,k);//左旋k个字符 is_left_move(arr,k,sz);//将arr与k传入函数 printf(%s\n,arr); return 0; }*/
4.【题目名称】
字符串旋转结果
【题目内容】 写一个函数判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如给定s1 AABCD和s2 BCDAA返回1
给定s1abcd和s2ACBD返回0. AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC //解题思路利用strncat函数字符串拼接函数将arr自身拷贝一份然后再利用字符串查找函数strstr(找得到就返回子串的首字符地址,找不到就返回NULL)即可 #includestdio.h #includestring.h int is_left_move(char*str1,char*str2) { int len1 strlen(str1); int len2 strlen(str2); if(len1!len2)//先判断两个字符串的长度是否相等如果不想等则一定不是子串 { return 0; } strncat(str1,str1,6);//给arr1后面再加个arr1 char*cy strstr(str1,str2);//指针接收strstr返回的地址若strstr没找到则返回空指针则说明不是子串 if(cyNULL) { return 0; } else return 1; } int main() { char arr1[] ABCDEF; char arr2[] DEFABC; int ret is_left_move(arr1,arr2);//将两个数组传到函数里面返回值设置为整数 if(ret 1) { printf(Yes\n);//是子串 } if(ret 0) { printf(No\n);//不是子串 } }
5.1//题目名称 //杨氏矩阵 //题目内容 //有一个数字矩阵矩阵的每行从左到右是递增的矩阵从上到下是递增的请编写程序在这样的矩阵中查找某i个数字不是矩阵中的数字 //要求时间复杂度小于oN
//时间复杂度小于oN //假设矩阵为 //1 2 3 //3 4 5 //4 5 6 //想要找到数字6那么至少得把数组遍历则需要找9次此时oN就等于9所以这种算法不满足要求
//解题思路观察矩阵的右上角数字3是一行中最大的数也是一列中最小的数假设给一个数字k若3k,则一行中没有比k更大的数 //则跳到下一行若3k则说明一列中没有比k更小的数则跳到前一列左下角的数字也可以以此类推
//1.利用右上角数字的解法 /*#includeStdio.h int find(int arr[3][3],int row,int lin,int k) { int x 0;//右上角数字的行坐标 int y lin-1;//右上角数字的列坐标 while(x2y0)//行坐标必须2(三行)列坐标必须0 { if(arr[x][y]k) { x; } else if(arr[x][y]k) { y--; } else { return 1; } } return 0;
} int main() { //int row 3; //int lin 3; int arr[3][3] {{1,2,3},{3,4,5},{4,5,6}}; int k 0; scanf(%d,k); int ret find(arr,3,3,k); if(ret1) { printf(找到了); } if(ret 0 ) { printf(找不到); } return 0; }*/
5.2:
//2.利用左下角数字的解法 #includeStdio.h int find(int arr[3][3],int row,int lin,int k) { int x row-1;//左下角数字的行坐标 int y 0;//左下角数字的列坐标 while(x2y0)//行坐标必须2(三行)列坐标必须0 { if(arr[x][y]k) { y; } else if(arr[x][y]k) { x--; } else { return 1; } } return 0;
} int main() { int arr[3][3] {{1,2,3},{3,4,5},{4,5,6}}; int k 0; scanf(%d,k); int ret find(arr,3,3,k); if(ret1) { printf(找到了); } if(ret 0 ) { printf(找不到); } return 0; }