返回

牛客网刷题

发布时间:2023-02-20 06:45:31 227
# less# git

 目录

​​1.打印从1到最大的n位数​​

​​2.HJ73 由年月日计算第几天​​

​​3.m的立方和等于m个连续奇数之和​​

​​4.计负均正​​

​​5.错误的集合​​

​​ 6.密码检查​​

​​7.几个位才能将整数A转成整数B​​

​​8.至少是其他数字两倍的最大数​​


1.打印从1到最大的n位数

​​打印从1到最大的n位数​​

  1. 第一点:最大的n位数:max=pow(10,n)-1
  2. 第二点:定义数组使,关于static修饰这里的局部变量和全局变量的问题
  3. 第三点:这个returnSize是用来计算返回数组元素个数,并传地址返回

因为这里的arr是自己定义的,也是我们返回的那个数组

static:

  1. 修饰局部变量,因为这里的arr是要返回到主函数,主函数内还要用的,和arr只用在函数内部有效不一样。
    我们知道局部变量的生命周期是变量定义开始到函数栈帧被销毁结束
    ,如果出了函数作用域,数组arr就会被销毁,但是这样的话,我们返回的arr就是一个野指针了;因此在定义数组时加上static则可以将局部变量的生命周期延长至整个生命周期,但是到了这里有人可能又要问了,static修饰局部变量并没有改变局部变量的作用域啊,即是你延长生命周期又有什么用呐?
    其实,出了作用域arr的确没用,但是我们可以把arr的地址返回,主函数内再通过返回值接收,就可以改掉arr里的内容和进行访问。
  2. 修饰全局变量:修饰全局变量的作用是限定该全局变量只能在本文件有效,在牛客这里是说防止重复定义。

牛客网刷题_i++

牛客网刷题_局部变量_02​编辑

static int arr[100000]={0};
int* printNumbers(int n, int* returnSize ) {
// write code here
//static int arr[100000]={0};
int max=pow(10,n)-1;
int i=1;
for(;i<=max;i++)
{
arr[i-1]=i;
}
*returnSize=max;
return arr;
}

牛客网刷题_i++_03

2.HJ73 由年月日计算第几天

​​HJ73 计算日期到天数转换​​

2022/08/03

  • 该年前7个月的总天数(先假定是平年2月28天,再if(闰年),天数+1)
  • 8月的3天
#include
int main()
{
int year,month,day;
int total_day=0;
while(~scanf("%d%d%d",&year,&month,&day))
{
if(year<1000||year>9999||month<1||month>12)
{
return 0;
}

int _month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
for(int i=0;i<month-1;i++)
{
total_day+=_month[i];
}
if(((year%4==0&&year%100!=0)||year%400==0)&&month>=3)
{
++total_day;
}
total_day+=day;

printf("%d\n",total_day);
}
return 0;
}

牛客网刷题_i++_04

3.m的立方和等于m个连续奇数之和

​​HJ76 尼科彻斯定理​​

等号左边的立方和好求,等号右边的m个连续奇数和,如果再知道首项,就很容易求出等差数列的和,问题转化为如何知道首项奇数i。

  1. 思路1:For(1-m*^3)遍历,if(等式),从而暴力求出首相奇数i
  2. 思路2:数学归纳法找规律,由数学公式直接求出首项奇数i

思路1代码:

#include
int main()
{
int m=0;
while(~scanf("%d",&m))
{
int pow=m*m*m;
int i=1;
for(;i<pow;i+=2)
{
if(pow==m*i+m*(m-1))
{
break;
}
}
char buf[20000]={0};
sprintf(buf,"%d",i);
int nextOdd=i;
for(int j=0;j<m-1;j++)
{
nextOdd+=2;
sprintf(buf,"%s+%d",buf,nextOdd);
}
printf("%s\n",buf);
}
return 0;
}

牛客网刷题_局部变量_05

思路2:数学归纳法 

牛客网刷题_数组_06

牛客网刷题_数组_07​编辑

#include
int main()
{
int m=0;
while(~scanf("%d",&m))
{
int pow=m*m*m;
int begin=m*m-(m-1);
char buf[20000]={0};

sprintf(buf,"%d",begin);
for(int i=0;i<m-1;i++)
{
sprintf(buf,"%s+%d",buf,begin+=2);
}
printf("%s\n",buf);
}
return 0;
}

牛客网刷题_局部变量_08

4.计负均正

​​记负均正​​

#include
int main()
{
int n=0;
while(~scanf("%d",&n))
{
int countZ=0,countF=0,sumZ=0;
int nums=0;
while(n--)
{
scanf("%d",&nums);
if(nums>0)
{
countZ++;
sumZ+=nums;
}
if(nums<0)
{
countF++;
}
}
if(countZ==0) printf("%d %.1f",countF,0);
else printf("%d %.1f",countF,(1.0*sumZ)/countZ);
}
return 0;
}

牛客网刷题_局部变量_09

5.错误的集合

​​645. 错误的集合​​

思路:我是看着这题错误的集合,是在​​消失的数字​​

  1. 第一步:动态开辟numsSize+1长度的计数数组.,下标就是0-numsSize,并用memset初始化为0
  2. 第二步:用哈希找出重复的数字
  3. 第三步:通过将1-n的数字和与去重后nums数组元素和的差求得丢失的数字

备注:

  1. 原数组的长度是numsSize,也是题目中给的1-n中的n,本应该的最大值
  2. 这题用重复的数字保证了备注里的点1(1-n),消失的数字这题用0保证了备注里的点1(0-n)
  3. 这里计数数组的长度一定是numsSize+1,下标才能是数组的元素范围1-numsSize

牛客网刷题_数组_10

牛客网刷题_数组_11​编辑

int* findErrorNums(int* nums, int numsSize, int* returnSize){
//第一步:动态开辟numsSize+1长度的计数数组.,下标就是0-numsSize,并用memset初始化为0
int* count=(int*)malloc(sizeof(int)*(numsSize+1));
memset(count,0,sizeof(int)*(numsSize+1));
//第二步:用哈希找出重复的数字
for(int i=0;i<numsSize;i++)
{
++count[nums[i]];
}
int repet=0;
for(int i=0;i<numsSize;i++)
{
if(count[nums[i]]==2)
{
repet=nums[i];
break;
}
}
int sum1=0;
for(int i=1;i<=numsSize;i++)
{
sum1+=i;
}
int sum2=0;
for(int i=0;i<numsSize;i++)
{
sum2+=nums[i];
}
//第三步:通过将1-n的数字和与去重后nums数组元素和的差求得丢失的数字
int missing=sum1-(sum2-repet);
int* arr=(int*)malloc(sizeof(int)*2);
*returnSize=2;
arr[0]=repet;
arr[1]=missing;
return arr;
}

牛客网刷题_数组_12或者看标准答案:

牛客网刷题_数组_13

牛客网刷题_局部变量_14​编辑

 6.密码检查

​​OR141 密码检查​​

思路:从易到难写代码,以下拦路虎

  1. 长度小于8
  2. 以数字开头
  3. 其他数字不为0
  4. 大写,小写,数字小于两种
#include
int main()
{
int n=0;
while(~scanf("%d",&n))
{
while(n--)
{
char* password[101]={0};
scanf("%s",password);
//拦路虎1
if(strlen(password)<8)
{
printf("NO\n");
continue;
}
//拦路虎2
char* ptr=password;
if(*ptr>='0'&&&*ptr<='9')
{
printf("NO\n");
continue;
}
//统计各种字符的个数,实际是看各种字符有没有
int upper=0,lower=0,digit=0,other=0;
while(*ptr)
{
if(*ptr>='A'&&*ptr<='Z') upper++;
else if(*ptr>='a'&&*ptr<='z') lower++;
else if(*ptr>='0'&&*ptr<='9') digit++;
else other++;
ptr++;
}
//拦路虎3
if(other>0)
{
printf("NO\n");
continue;
}
//拦路虎4
if((upper>0)+(lower>0)+(digit>0)<2)
{
printf("NO\n");
continue;
}
//能到这里说明挑战成功,输出YES
printf("YES\n");
}//end of while(n--)
}
return 0;
}

牛客网刷题_数组_15

我觉得题解中一些比较好的代码书写方式:

  1. 首先是命名规范,password密码,upper大写,lower小写,digit数字,other其他
  2. 在多种if判断拦路虎下,从易到难讨论
  3. 没有直接改动password,而是定义了一个新的变量ptr
  4. 拦路虎4,用比较逻辑判断判断该类字符有没有

7.几个位才能将整数A转成整数B

​​题目链接​​

思路:

  1. 异或标记不同为1,相同为0
  2. 右移操作符分别移动 0-32位 ,然后和1按位与,判断结果是否为1,是1则计数
int convertInteger(int A, int B){
int C=A^B;
int count=0;
for(int i=0;i<32;i++)
{
if((C>>i)&1==1)
{
count++;
}
}
return count;
}

牛客网刷题_局部变量_16

8.至少是其他数字两倍的最大数

​​题目链接​​

思路:

  1. 第一步:找到最大的元素max,并记录下标maxindex
  2. 第二步:找到次大的元素lessmax
int dominantIndex(int* nums, int numsSize){
//点1:初始化为nums[i]范围的最小值,避免lessmax=nums[0]时nums[0]就是最大值的错误
int max=0;
int maxindex=0;
int lessmax=0;
//第一步:找到最大的元素max,并记录下标maxindex
for(int i=0;i<numsSize;i++)
{
if(max<nums[i])
{
max=nums[i];
maxindex=i;
}
}
//第二步:找到次大的元素lessmax
for(int i=0;i<numsSize;i++)
{
//点2,i==maxindex时跳过
if(i==maxindex)
{
continue;
}
else
{
if(lessmax<nums[i])
{
lessmax=nums[i];
}
}
}

if(max>=lessmax*2)
{
return maxindex;
}
else
{
return -1;
}
}

牛客网刷题_i++_17

8.两个数组的交集

​​题目链接​​

牛客网刷题_数组_18

牛客网刷题_i++_19​编辑

数组哈希法:

  1. 遍历数组1,用数组1的值作为map的下标,记录数组1中值出现的个数
  2. 遍历数组2,如果数组2作为map的下标中标记的个数不为0并且retArr不存在这个值的话,则添加到retArr数组中.

牛客网刷题_i++_20

牛客网刷题_i++_21​编辑

static int retArr[1001]={0};
static int map[1001]={0};

int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
*returnSize=0;
for(int i=0;i<nums1Size;i++)
{
map[nums1[i]]++;
}
for(int i=0;i<nums2Size;i++)
{
if(map[nums2[i]])
{
int j=0;
for(;j<*returnSize;j++)
{
if(retArr[j]==nums2[i])
{
break;
}
}
if(retArr[j]==nums2[i])
{
break;
}
else
{
retArr[(*returnSize)++]=nums2[i];
}
}
}
return retArr;
}

牛客网刷题_局部变量_22

 听说学了C++可以使用set给数组2去重,使得retArr数组中每一个元素都是唯一的.

 

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
牛客网刷题(一) 2023-02-20 06:11:11