💗 💗 博客:小怡同学
💗 💗 个人简介:编程小萌新
💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞
文章目录
- 牛客网题号: JZ17 打印从1到最大的n位数
- 牛客网题号: HJ73 计算日期到天数转换
- 牛客网题号: HJ76 尼科彻斯定理
- 牛客网题号: HJ100 等差数列
- 牛客网题号: HJ97 记负均正
- leetcode 题号:645. 错误的集合
- 牛客网题号: OR141 密码检查
- 牛客网题号: JZ53 数字在升序数组中出现的次数
- leetcode 题号:面试题 05.06. 整数转换
- leetcode 题号:747. 至少是其他数字两倍的最大数
- leetcode 题号:349. 两个数组的交集
- 牛客网题号: HJ34 图片整理
- leetcode 题号:724. 寻找数组的中心下标
- 牛客网题号: HJ10 字符个数统计
- leetcode 题号:169. 多数元素
牛客网题号: JZ17 打印从1到最大的n位数
描述
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
- 用返回一个整数列表来代替打印
- n 为正整数,0 < n <= 5
int* printNumbers(int n, int* returnSize ) {
*returnSize = pow(10,n)-1;
int* arr = (int*)malloc(sizeof(int) * *returnSize);//动态申请扩容,共是*returnSize * int 个字节
for(int i = 0 ;i <*returnSize ; i++)
{
arr[i] = i+1;
}
return arr;
}
牛客网题号: HJ73 计算日期到天数转换
根据输入的日期,计算是这一年的第几天。
保证年份为4位数且日期合法。
#include <stdio.h>
int is_leap_year(int year)
{
if(year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
{
return 1;
}
return 0;
}
int main() {
int month_day[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int year,month,day;
while (~scanf("%d %d %d", &year, &month,&day)) {
int total_day = day;
if(is_leap_year(year) && month > 2 )
total_day +=1; //比二月大且是闰年加一天
for(int i = month - 1 ; i > 0 ; i--)//i不等于0是因为创建数组时month_day[0]==0
{
total_day += month_day[i];
}
printf("%d ",total_day);
}
return 0;
}
牛客网题号: HJ76 尼科彻斯定理
验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。
例如:
1^3=1
2^3=3+5
3^3=7+9+11
4^3=13+15+17+19
#include <stdio.h>
int main() {
int a;
while (scanf("%d", &a) != EOF) {
int start = a * a - (a - 1);//有题意可知起始奇数公式为 m*m-(m-1)
printf("%d",start);
for(int i = 1 ; i < a ; i++)
{
printf("+%d",start + 2 * i);
}
printf("\n");
}
return 0;
}
牛客网题号: HJ100 等差数列
等差数列 2,5,8,11,14。。。。
(从 2 开始的 3 为公差的等差数列)
输出求等差数列前n项和
#include <stdio.h>
int SUM(int a)
{
return 2+(a-1)*3;
}
int main() {
int a=0;
scanf("%d", &a);
int sum = 0;
for(int i = 0; i < a ; i++)
{
sum +=SUM(i+1);
}
printf("%d",sum);
return 0;
}
牛客网题号: HJ97 记负均正
描述
首先输入要输入的整数个数n,然后输入n个整数。输出为n个整数中负数的个数,和所有正整数的平均值,结果保留一位小数。
0即不是正整数,也不是负数,不计入计算。如果没有正数,则平均值为0。
#include <stdio.h>
int main() {
int n = 0;
scanf("%d",&n);
int tmp =0;
float sum = 0.0;
int count_sum = 0;
int count_num = 0;
for(int i = 0 ; i < n ; i++)
{
scanf("%d",&tmp);
if(tmp > 0)
{
sum += tmp;
count_sum++;
}
else if(tmp < 0)
count_num++;
}
if(count_sum == 0)
printf("%d 0.0",count_num);
else
printf("%d %.1lf\n",count_num,sum/count_sum);
return 0;
}
leetcode 题号:645. 错误的集合
集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。
给定一个数组 nums 代表了集合 S 发生错误后的结果。
请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
int* findErrorNums(int* nums, int numsSize, int* returnSize){
*returnSize =2;
int* ret = (int*)malloc(sizeof(int) * 2);
int* arr = (int*)calloc(numsSize+1,sizeof(int));
int sum = 0;
int sum2 = 0;
for(int i = 0;i<numsSize;i++)
{
if(arr[nums[i]] == 1)
ret[0] = nums[i];
arr[nums[i]] = 1;
sum += i+1;
sum2 += nums[i];
}
ret[1] = sum - (sum2 - ret[0]);
free(arr)
return ret;
}
牛客网题号: OR141 密码检查
小明同学最近开发了一个网站,在用户注册账户的时候,需要设置账户的密码,为了加强账户的安全性,小明对密码强度有一定要求:
- 密码只能由大写字母,小写字母,数字构成;
- 密码不能以数字开头;
- 密码中至少出现大写字母,小写字母和数字这三种字符类型中的两种;
- 密码长度至少为8
现在小明受到了n个密码,他想请你写程序判断这些密码中哪些是合适的,哪些是不合法的。
int main() {//数组名不可以直接++,可以用一个指针指向数组名
int n =0;
scanf("%d" ,&n);
for(int i = 0 ; i < n ; i++)
{
int flag_num = 0;
int flag_low = 0;
int flag_cap = 0;
int other = 0;
char str [101]={0};
char* cur =str;
scanf("%s" ,str);
if( *cur>= '0' && * cur <= '9' )
{
printf("NO\n");
continue;
}
if(strlen(cur) < 8)
{
printf("NO\n");
continue;
}
while(*cur != '\0')
{
if(*cur >= 'A' && *cur <= 'Z' )
flag_cap = 1;
else if( *cur >= 'a' && *cur<= 'z')
flag_low = 1;
else if(*cur <= '9' && *cur >='0')
flag_num = 1;
else
other++;
cur++;
}
if(other >0)
{
printf("NO\n");
continue;
}
if((flag_cap >0) + (flag_low>0) + (flag_num>0) >= 2)
printf("YES\n");
}
return 0;
}
牛客网题号: JZ53 数字在升序数组中出现的次数
整数转换。编写一个函数,确定需要改变几个位才能将整数A转成整数B
int get_bin_cout(int num)
{
int count = 0;
for(int i =0 ; i < 32 ;i++)//4个字节32个比特位
{
if((num >> i) & 1)//&的作用是 (0 ,1) & 0 == 0 1 & 1 == 1
count++;
}
return count;
}
int convertInteger(int A, int B){
return get_bin_cout(A^B);//^的作用是相同为0相异为一
}
leetcode 题号:面试题 05.06. 整数转换
整数转换。编写一个函数,确定需要改变几个位才能将整数A转成整数B
int get_bin_cout(int num)
{
int count = 0;
for(int i =0 ; i < 32 ;i++)
{
if((num >> i) & 1)
count++;
}
return count;
}
int convertInteger(int A, int B){
return get_bin_cout(A^B);
}
leetcode 题号:747. 至少是其他数字两倍的最大数
给你一个整数数组 nums ,其中总是存在 唯一的 一个最大整数 。
请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是,则返回 最大元素的下标 ,否则返回 -1
int dominantIndex(int* nums, int numsSize){
int max_1 =0;
int max_2 =0;
if(nums[1] > nums[0])
{
max_1 = 1;
max_2 = 0;
}
else
{
max_1 = 0;
max_2 = 1;
}
for(int i = 2 ; i < numsSize ; i++)
{
if(nums[i] > nums[max_1])
{
max_2 = max_1;
max_1 = i;
}
else
{
if(nums[max_2] < nums[i])
max_2 = i;
}
}
int cur = nums[max_2] * 2;
if(cur <= nums[max_1])
return max_1;
else
return -1;
}
leetcode 题号:349. 两个数组的交集
给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
*returnSize = 0;
static int arr[1000];
int i=0;
int j =0;
int n=0;
for(i = 0 ; i< nums1Size ;i++)
{
for( j = 0 ; j < nums2Size ; j++)
{
if(nums1[i] == nums2[j])//判断两个数组中是否有相同元素
break;
}
if( j == nums2Size)//遍历一遍后是否存在
continue;
for( n =0 ; n < *returnSize ;n++)
{
if(nums1[i] == arr[n])
break;
}
if(n == *returnSize)
{
arr[*returnSize] = nums1[i];
*returnSize += 1;
}
}
return arr;
}
牛客网题号: HJ34 图片整理
描述
Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好。请大家给Lily帮忙,通过代码解决。
Lily使用的图片使用字符"A"到"Z"、“a"到"z”、"0"到"9"表示
#include <stdio.h>
#include <string.h>
int main() {//冒泡排序
char arr[1000] = {0};
scanf("%s",arr);
int len = strlen(arr);
for(int i = 0 ; i < len-1;i++)
{
for(int j = 0 ; j < len -1-i ; j++)
{
if(arr[j] > arr[j+1])
{
char kmp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = kmp;
}
}
}
printf("%s",arr);
return 0;
}
leetcode 题号:724. 寻找数组的中心下标
编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次
例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3 。
int pivotIndex(int* nums, int numsSize){//两次循环,外层循环找下标,内增循环总计左右之和
for(int i =0 ; i < numsSize ;i++)
{
int sum_l = 0;
int sum_r = 0;
for(int j = 0 ; j < numsSize ; j++)
{
if(j < i)
{
sum_l += nums[j];
}
else if(j > i)
{
sum_r += nums[j];
}
}
if(sum_l == sum_r)
return i;
}
return -1;
}
牛客网题号: HJ10 字符个数统计
描述
编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次
例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3 。
#include <stdio.h>
#include <string.h>
int main() {
char arr[500] ={0};
scanf("%s",arr);
char str [500] ={0};
int len = strlen(arr);
int count =0;
for(int i = 0 ; i < len ;i++)
{
if(str[arr[i]] == 0)//把重复的元素当成下标,并标志1
{
count++;
}
str[arr[i]] = 1;
}
printf("%d",count);
return 0;
}
//写法二
#include <stdio.h>
#include <string.h>
int main() {
char arr [501]={0};
while(~scanf("%s",arr))
{
char str [500] ={0};
char* cur =arr;//开辟新的数组当下标,并有一个指针来接收,因为数组名不可以++;
int count = 0;
while(*cur != '\0')
{
if(str[*cur] != 1)//
{
count++;
}
str[*cur++] = 1;
}
printf("%d\n",count);
}
return 0;
}
leetcode 题号:169. 多数元素
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
int majorityElement(int* nums, int numsSize){
int tmp = nums[0];
int count = 1;
for(int i = 1 ; i < numsSize ; i++)
{
if(nums[i] == tmp)
{
count++;
}
else
{
count--;
if(count == 0)
tmp = nums[i+1];//相邻判断,tmp迭代之后count为1
}
}
return tmp;
}