手机wap版网站制作,做第三方支付网站违法吗,网架公司的螺丝是不是公司安好,做视频开头动画网站欢迎来到我的世界
希望这篇文章对你有所帮助#xff0c;有不足的地方还请指正#xff0c;大家一起学习交流 ! 目录 前言编程题第一题#xff1a;珠玑妙算第二题#xff1a;寻找奇数第三题#xff1a;寻找峰值第四题#xff1a;数对 总结 前言 这是暑假题目的收尾文章有不足的地方还请指正大家一起学习交流 ! 目录 前言编程题第一题珠玑妙算第二题寻找奇数第三题寻找峰值第四题数对 总结 前言 这是暑假题目的收尾文章我的暑假作业一共写了四篇文章本篇文章有四篇编程题我很喜欢四这个数字感谢铁子们的支持新的篇章即将来到。 编程题
第一题珠玑妙算 地址oj地址 解题思路: 暴力求解分别记录猜中的个数和伪猜中的个数存入数组相应位置。 猜中的个数好记录直接让颜色组合的数组与猜测的数组进行一一比较如果相等那猜中的个数伪猜中的个数进行两次遍历;第一次遍历颜色组合的数组在让该数组中的元素都遍历一遍猜测数组元素如果相等伪猜中个数注意并将猜测数组该位置赋值为空格 这是为了确定唯一性; 注意这里伪猜中的个数包含了猜中的个数所以在存入数组的是(伪猜中的个数-猜中的个数) 代码实现
int* masterMind(char* solution, char* guess, int* returnSize) {*returnSize 2;//只用两个元素分别记录猜中个数和伪猜中个数int* arr (int*)malloc(sizeof(int) * (*returnSize));int i 0;int sum 0;//猜中的个数for (i 0; i 4; i){if (solution[i] guess[i]){sum;}}arr[0] sum;int count 0;//记录违猜中的个数int j 0;for (i 0; i 4; i){for (j 0; j 4; j){if (solution[i] guess[j] )//找到相等的且将猜测数组中的值该成空格{count;guess[j] ;break;}}}arr[1] count - arr[0];return arr;
}
第二题寻找奇数 地址oj地址 解题思路: 这道题其实也叫做寻找单身狗 考察的是对按位异或^的深刻了解 我们首先来了解下^他的运算原则是相同为0相异位1; 在来看到一个数^他相同数结果为0 假如一个数3二进制码011 当3 ^ 3 0 所以3 ^ 0 3 结论 0 ^任何数都 该数本身任何数^该数本身0 所以我们可以利用这一特性 题目中说输入一个数组该数组只有唯一的一个单着的 所以让0按位异或^上该数组所有数就可以找出那个单着的数 就像单身狗一样无所遁形 代码实现
int main() {int n0;scanf(%d,n);int i0;int arr0;int m0;//m^上该数组所有元素for(i0;in;i){scanf(%d,arr);m^arr;}printf(%d,m);return 0;
}第三题寻找峰值 地址oj地址 第一个解题思路:暴力求解 根据在数组范围内只要一个数严格大于两侧的数就为峰值对nums数组进行遍历找到一个峰值即可 暴力求解代码实现
int findPeakElement(int* nums, int numsLen ) {// write code hereint i0;if(numsLen1)//若只有一个值其本身就是峰值return 0;if(nums[0]nums[1])//若峰值为第一个元素单独讨论return 0;if(nums[numsLen-1]nums[numsLen-2])//若峰值为最后一个元素单独讨论return numsLen-1;for(i1;inumsLen-1;i)//遍历[1,numsLen-1)范围{if(nums[i]nums[i-1] nums[i]nums[i1])//找到峰值{return i;}}return 0;//若还是找不到峰值就返回0
}第二个解题思路:二分思想 在首元素和最后一个为峰值都要单独考虑 二分思想设置三个指针left,right,找到中间位置的值mid然后根据mid和其两边的值的进行比较哪边要大于mid值就往那边找峰值直到mid值严格大于其两边的值 如果 nums[mid]nums[mid1]那么意味这峰值位于mid右边根据二分查找的思想让leftmid1若 nums[mid]nums[mid1],那就意味着峰值位于mid的左边根据二分查找的思想让rightmid;注意mid的值mid left (right - left) / 2; - 二分求解代码实现
int findPeakElement(int* nums, int numsLen ) {// write code hereif (numsLen 1 || nums[0] nums[1]) return 0;if (nums[numsLen - 1] nums[numsLen - 2]) return numsLen - 1;int left 0, right numsLen - 1, mid;while (left right) {mid left (right - left) / 2;if (nums[mid] nums[mid1])//中间比右边小意味着右边肯定有个峰值left mid 1;else //否则在左边包括当前位置肯定有个峰值right mid;}return right;
}第四题数对 地址oj地址 第一个解题思路:暴力求解 暴力求解将 x 和 y 分别遍历 [1, n] 进行判断当 x % y k 时统计计数 count 即可,但是这样的话当 n 的值非常大的时候循环次数将非常恐怖需要循环 n^2 次 注意这个方法会运行超时 代码实现
#include stdio.hint main() {int i0;int j0;int n,k;long count0;scanf(%d%d,n,k);for(i1;in;i){for(j1;jn;j){if((i%j)2){count;}}}printf(%ld,count);return 0;
}第二个解题思路: 要理解数学公式((n/y)*(y-k))((n%yk)?0:(n%y-k1)); 假如n10k3 当 y k 时意味着任何数字取模y的结果都在 [0, k-1]之间都是不符合条件的。 当yk14,x 符合条件的数字有 3,7 当yk25,x 符合条件的数字有 3,4,8,9; 所以当ykn x小于y当前值且符合条件的数字数量是y-k个 x大于y当前值小于2*y的数据中且符合条件的数字数量是y-k个 可以能看出来在y的整数倍区间内x符合条件的数量就是 (n / y) * (y - k)个; n / y 表示有多少个完整的 0 ~ y区间y - k 表示有每个区间内有多少个符合条件的数字; 最后还要考虑的是6...往后这种超出倍数区间超过n的部分的统计 n % y 就是多出完整区间部分的数字个数其中k以下的不用考虑 则符合条件的是 n % y - (k-1) 个。 这里需要注意的是类似于9这种超出完整区间的数字个数 本就小于k的情况则为0 最终公式(n / y) * (y - k) ((n % y k) ? 0, (n % y - k 1)); 代码实现
#include stdio.hint main() {long n,k;scanf(%ld%ld,n,k);if(k0){printf(%ld,n*n);return 0;}long count0;for(long yk1;yn;y){count((n/y)*(y-k))((n%yk)?0:(n%y-k1));}printf(%ld,count);return 0;
}总结 到了最后感谢支持
我还想告诉你的是 ------------对过程全力以赴对结果淡然处之 也是对我自己讲的