01:打印从1到最大的n位数
链接: JZ17 打印从1到最大的n位数
描述
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
- 用返回一个整数列表来代替打印
- 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));
}
}