【寒假刷题篇】–01

勤奋不是嘴上说说而已,而是实际的行动,在勤奋的苦度中持之以恒,永不退却。业精于勤,荒于嬉;行成于思,毁于随。在人生的仕途上,我们毫不迟疑地选择勤奋,她是几乎于世界上一切成就的催产婆。只要我们拥着勤奋去思考,拥着勤奋的手去耕耘,用抱勤奋的心去对待工作,浪迹红尘而坚韧不拔,那么,我们的生命就会绽放火花,让人生的时光更加的闪亮而精彩。

导读:本篇文章讲解 【寒假刷题篇】–01,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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));
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/142472.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!