【寒假刷题篇】--01

01:打印从1到最大的n位数

链接: JZ17 打印从1到最大的n位数
描述
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

  1. 用返回一个整数列表来代替打印
  2. n 为正整数,0 < n <= 5

示例1
输入:
1
返回值:
[1,2,3,4,5,6,7,8,9]

🎇关键:
n位数的最大数位:10^n-1

C实现

💧解法1:使用数组
缺点:浪费空间

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param n int整型 最大位数
 * @return int整型一维数组
 * @return int* returnSize 返回数组行数
 */
 static int arr[100000];
int* printNumbers(int n, int* returnSize ) {
    // write code here
    int max=0;
    for(int i=0;i<n;i++)
    {
        max+=9*pow(10,i);
    }
    for(int i=1;i<=max;i++)
    {
        arr[i-1]=i;
    }
    *returnSize=max;
    return arr;
}

🚀解法2:使用动态开辟内存函数malloc

(void *)malloc(size_t)

(这里算10^n可以使用C中数学函数pow(x,n)来计算x ^ n,注意引入头文件math.h

double)pow(double x,double n)
int* printNumbers(int n, int* returnSize ) {
    // write code here
    int max=pow(10,n)-1;//max为n位最大数
    *returnSize=max;
    int *arr=(int *)malloc(sizeof(int)*(*returnSize));
    
    for(int i=1;i<=max;i++)
    {
       arr[i-1]=i;
    }
    return arr;
}

C++实现

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 最大位数
     * @return int整型vector
     */
    vector<int> printNumbers(int n) {
        // write code here
        vector<int>ans;
        int max=1;//注意这里要初始化为1s
        for(int i=1;i<=n;i++)
        {
            max*=10;//max实际上是n+1位数,max-1即为n位最大数
        }
        for(int i=1;i<max;i++)//最大n位数即为n-1
        {
            ans.push_back(i);
        }
        return ans;
    }
};

✨vector容器的使用
✨vector中push_back方法添加元素

java实现

🚕使用数组,动态开辟

import java.util.*;


public class Solution {

    public int[] printNumbers (int n) {
        int max=1;
        for(int i=1;i<=n;i++)
        {
            max*=10;
        }
        int[] res=new int[max-1];//动态开辟数组大小
        for(int i=1;i<max;i++)
        {
            res[i-1]=i;
        }
        return res;
    }
}

✨java中可以使用变长数组

02计算日期到天数转换

🌄链接:HJ73 计算日期到天数转换

描述
根据输入的日期,计算是这一年的第几天。
保证年份为4位数且日期合法。
进阶:时间复杂度:O(n)\O(n) ,空间复杂度:O(1)\O(1)
输入描述
输入一行,每行空格分割,分别是年,月,日
输出描述:
输出是这一年的第几天
示例1
输入:
2012 12 31
输出:
366
示例2
输入:
1982 3 4
输出:
63

C实现

💘解法1:利用switch-case语句实现(利用了case只作为入口的特点,实现了累加)

#include <stdio.h>

int main() {
    int year = 0, mon = 0, day = 0;
    while ((scanf("%d %d %d", &year, &mon, &day)) != EOF) {
        int count = 0;
        switch (mon) {
            case 12:
                count+=30;
            case 11:
                count+=31;
            case 10:
                count+=30;
            case 9:
                count+=31;
            case 8:
                count+=31;
            case 7:
                count+=30;
            case 6:
                count+=31;
            case 5:
                count+=30;
            case 4:
                count+=31;
            case 3:
                if((year%400==0)||(year%4==0&&year%100!=0))
                    count+=29;//闰年
                else
                    count+=28;
            case 2:
                count+=31;
            case 1:
                count+=0;      
        }
        count+=day;
        printf("%d",count);
    }
    return 0;
}

🗼解法2:利用数组,存储每个月对应的天数,再根据月份来累加天数,原理和解法1一样

#include <stdio.h>

int main() {
    int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int year=0,mon=0,day=0;
    while((scanf("%d %d %d",&year,&mon,&day))!=EOF)
    {
        int sum=0;
        for(int i=1;i<mon;i++)//从前往后累加
        {
            sum+=arr[i];
        }
        if(mon>2)//月份大于2 ,要单独讨论一下闰年
        {
            if((year%400==0)||((year%4==0)&&(year%100)!=0))//如果是闰年,则天数多出来一天
            {
                sum++;
            }
        }
        sum+=day;//加上天数
        printf("%d\n",sum);
    }
   
    return 0;
}

C++代码

#include <iostream>
using namespace std;

int main() {
   int year=0,mon=0,day=0;
   int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
   while(cin>>year>>mon>>day)
   {
        int sum=0;
        for(int i=1;i<mon;i++)
        {
            sum+=arr[i];
        }
        if(mon>2)
        {
            if((year%400==0)||((year%4==0)&&(year%100)!=0))
            {
                sum++;
            }
        }
        sum+=day;
        cout<<sum<<endl;
   }
   return 0;
}

复习一下:c++的输入输出
cin:键盘
>>:数据提前符(把数据流中数据注入到year,再到mon再到day)
cout:屏幕
<<:插入运算

java实现:

🌠使用java.util中的Calendar包

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in =new Scanner(System.in);
        int y=in.nextInt();
        int m=in.nextInt();
        int d=in.nextInt();

        Calendar c=Calendar.getInstance();//实例化
        c.set(y,m-1,d);//注意这是m-1
        System.out.print(c.get(Calendar.DAY_OF_YEAR));
    }
}
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是瑶瑶子啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值