OJ题库:计算日期到天数转换、打印从1到最大的n位数 、尼科彻斯定理

这篇具有很好参考价值的文章主要介绍了OJ题库:计算日期到天数转换、打印从1到最大的n位数 、尼科彻斯定理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        前言:在部分大厂笔试时经常会使用OJ题目,这里对《华为机试》和《剑指offer》中的部分题目进行思路分析和讲解,希望对各位读者有所帮助。

OJ题库:计算日期到天数转换、打印从1到最大的n位数 、尼科彻斯定理,OJ题库——剑指offer,华为,算法,华为od,oj,leetcode,c++,牛客网

题目来自牛客网,欢迎各位积极挑战:

HJ73:计算日期到天数转换_牛客网

JZ17:打印从1到最大的n位数_牛客网

HJ76:尼科彻斯定理_牛客网

目录

HJ73 计算日期到天数转换

题目相关消息

题目描述

输入描述 

输出描述 

示例

 分析问题解决思路

具体实现细节: 

 完整代码实现

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

题目相关消息

描述

示例

分析问题解决思路

具体实现细节

 完整代码实现

HJ76 尼科彻斯定理

题目相关信息

题目描述

 输入描述

输出描述

示例 

分析问题解决思路 

具体实现细节

完整代码实现


HJ73 计算日期到天数转换

题目相关消息

题目描述

根据输入的日期,计算是这一年的第几天。

保证年份为4位数且日期合法。

进阶:时间复杂度: O(n) ,空间复杂度: O(1) 

输入描述 

输入一行,每行空格分割,分别是年,月,日

输出描述 

输出是这一年的第几天

示例

输入:2012 12 31

输出:366

输入:1982 3 4

输出:63

 分析问题解决思路

题目让我们输出有多少天,只要解决了以下俩个小问题,问题就迎刃而解了

  1. 闰年的情况,我们需要判断输入是否是闰年,在闰年内,2月是29天,这是与正常平年不同的情况,因此我们需要设计和函数来判断是否是闰年
  2. 我们在判断的时候应该使用累加的思想,从1月累加到目标月,但是值得注意的一点是,目标月不能直接加当前月份总的天数,应该加上用户输入的天数

具体实现细节: 

        首先我们需要先设计一个判断闰年的函数,如果是闰年就返回1,不是就返回0,方便后续进行调用判断:

int judgeleapyear(int year)
{
	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
	{
		return 1;
	}
	else
		return 0;
}

        主函数方面,我们定义一个整形变量 days 来记录从这一年的第一天到现在一共有多少天,定义 year, month, day三个整形变量分别来记录用户输入的值,从一月开始遍历到目标月,不包含目标月,如果是大月 days 就加31,如果是小月就加30,另外在2月的时候,使用一个 if 语句来判断当前 2 月有多少天

        //大月
		if ((months == 1) || (months == 3) || (months == 5) || (months == 7) || (months == 8) || (months == 10) || (months == 12))
		{
			days += 31;
		}
		//小月
		else if ((months == 4) || (months == 6) || (months == 9) || (months == 11))
		{
			days += 30;
		}
		//二月
		else
		{
			//润年
			if (ret == 1)
			{
				days += 29;
			}
			//平年
			else
			{
				days += 28;
			}
		}

 完整代码实现

//HJ73
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int judgeleapyear(int year)
{
	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
	{
		return 1;
	}
	else
		return 0;
}

int main()
{
	int year = 0;
	int month = 0;
	int day = 0;
	int days = 0;
	scanf("%d %d %d", &year, &month, &day);

	//判断是否是闰年
	int ret = judgeleapyear(year);

	//从一月加到目标月
	for (int months = 1; months < month; months++)
	{
		//大月
		if ((months == 1) || (months == 3) || (months == 5) || (months == 7) || (months == 8) || (months == 10) || (months == 12))
		{
			days += 31;
		}
		//小月
		else if ((months == 4) || (months == 6) || (months == 9) || (months == 11))
		{
			days += 30;
		}
		//二月
		else
		{
			//润年
			if (ret == 1)
			{
				days += 29;
			}
			//平年
			else
			{
				days += 28;
			}
		}
	}

	days += day;
	printf("%d", days);


	return 0;
}

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

题目相关消息

描述

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

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

示例

输入:1

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

        注意,这道题目是接口题,我们只需要完善题目给出的函数就可以了,将需要返回的值返回就完成了

int* printNumbers(int n, int* returnSize)
{

}

分析问题解决思路

        首先,我们需要明确一件事,这道题是接口题,我们不能像普通的 ACM 模式的题那样写个循环直接打印,我们需要将数据放在一块空间内,然后将其返回

        既然是要放在空间内,那我们就使用 malloc 函数来动态开辟空间,最后在这些空间内逐个赋值就可以了

具体实现细节

        首先我们得先明确数值的范围,如下所示的过程中,我们不难发现,这是次方的关系,也就是说 10^n-1 就是数值的最大值

  • 1 位数的数值就是 1~9
  • 2 位数的数值就是 1~99
  • 3 位数的数值就是 1~999
  • 4 位数的数值就是 1~9999

        那么在这里我们就使用 <math.h> 头文件中的库函数 pow 来实现次方的效果,这样我们就获得了数值的大小范围

    //返回数组元素的个数
    *returnSize = pow(10, n) - 1;

        接下来就是动态分配空间,在这里需要注意的是要进行强制类型转化,不然会因为前后类型不一致导致 bug,一个整形大小是 sizeof(int),一共有 *returnsize 个整形

     //动态分配空间
    int* arr = (int*)malloc(*returnSize * sizeof(int));//malloc(字节数)

最后赋值就非常简单了,使用 for 循环实现就可以了

    //赋值
    for (int i = 0; i < *returnSize; ++i)
    {
        *(arr + i) = i + 1;
    }

 完整代码实现

int* printNumbers(int n, int* returnSize)
{
    //返回数组元素的个数
    *returnSize = pow(10, n) - 1;
    //动态分配空间
    int* arr = (int*)malloc(*returnSize * sizeof(int));//malloc(字节数)
    //赋值
    for (int i = 0; i < *returnSize; ++i)
    {
        *(arr + i) = i + 1;
    }
    //返回
    return arr;
}

HJ76 尼科彻斯定理

题目相关信息

题目描述

验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和

例如:

1^3=1

2^3=3+5

3^3=7+9+11

4^3=13+15+17+19

输入一个正整数m(m≤100),将m的立方写成m个连续奇数之和的形式输出

数据范围: 1≤m≤100 

进阶:时间复杂度:O(m) ,空间复杂度:O(1) 

 输入描述

输入一个int整数

输出描述

输出分解后的string

示例 

输入:6

输出:31+33+35+37+39+41

分析问题解决思路 

首先,我们必须得理解这个题目背后的数学原理,我们举例如下

OJ题库:计算日期到天数转换、打印从1到最大的n位数 、尼科彻斯定理,OJ题库——剑指offer,华为,算法,华为od,oj,leetcode,c++,牛客网

        我们会发现,在多项式中的第一项和最后一项是有迹可循的,我们对于第一项和最后一项的总结如下

  1. 第一项:(n-1)^2+((n-1)-1)+2
  2. 最后一项:n^2+(n-1)

具体实现细节

我们先使用俩个变量来找到刚才所描述的第一项和最后一项

	int m_first = 0;
	int m_end = 0;

	m_first = (m - 1) * (m - 1) + (((m - 1) - 1) + 2);
	m_end = (m * m) + (m - 1);

        在找到第一项后,我们就可以使用遍历累加来打印了,在尼科彻斯定理表示的多项式中,多项式的数量要表达的整数m是一样的,都是m,基于此,我们就可以使用循环了,每一次都打印一个奇数,然后在让这个奇数加 2,最后再直接打印最后一项

	for (int i = 0; i < (m - 1); i++)
	{
		printf("%d+", m_first);
		m_first += 2;
	}
	printf("%d", m_end);

完整代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>

void math_N(int m)
{
	int m_first = 0;
	int m_end = 0;

	m_first = (m - 1) * (m - 1) + (((m - 1) - 1) + 2);
	m_end = (m * m) + (m - 1);

	for (int i = 0; i < (m - 1); i++)
	{
		printf("%d+", m_first);
		m_first += 2;
	}
	printf("%d", m_end);
}

int main()
{
	int m = 0;
	scanf("%d", &m);

	math_N(m);

	return 0;
}

本次分享就到此结束了,希望我的分享对您有所帮助文章来源地址https://www.toymoban.com/news/detail-702582.html

到了这里,关于OJ题库:计算日期到天数转换、打印从1到最大的n位数 、尼科彻斯定理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【案例】js 计算日期之间的天数

    new Date(\\\'2023-03-06\\\') 作用是转换成标准时间,再进行计算的,而不是转换为字符串在进行计算,切记啊!! 代码看起来只是传值的时候不一样;而实际转换时有区别

    2024年02月06日
    浏览(45)
  • mysql 日期 计算 时间差 天数差

    第一种:TIMESTAMPDIFF函数 三个参数。第一个参数是比较的类型: FRAC_SECOND、SECOND、 MINUTE、 HOUR、 DAY 、 WEEK 、 MONTH 、 QUARTER、 YEAR 几种类型。第二、三参数是时间, 后减前 : 第二种: DATEDIFF函数 两个参数。前减后。得到相差的天数。 NOW() 当前的年月日时分秒,如:2023-03-09

    2024年02月07日
    浏览(57)
  • Java计算两个日期之间的天数差

    在Java中,我们可以使用Java 8引入的 java.time 包来处理日期和时间。下面是一种方法来计算两个日期之间的天数差。 首先,我们需要导入相关的类: 然后,我们可以编写一个方法来计算日期之间的天数差: 在这个方法中,我们使用了 ChronoUnit.DAYS.between 方法来计算两个 LocalDa

    2024年02月03日
    浏览(40)
  • java计算两个日期间的天数

    1、精确到年月日 2、精确到秒,向下取值 如有问题,欢迎指正~ 如能帮到您,欢迎点赞收藏~

    2024年02月11日
    浏览(49)
  • java 计算两个日期之间相隔的天数

    在Java 8中,你可以使用 java.time 包中的 LocalDate 类和 Period 类来计算两个日期字符串之间相隔的天数。以下是一个示例代码: 在这个示例中,我们首先将日期字符串解析为 LocalDate 对象,然后使用 Period.between() 方法计算两个日期之间的时期。最后,我们使用 Period.getDays() 方法获

    2024年02月05日
    浏览(51)
  • 在线推算两个日期相差天数的计算器

     具体请前往:在线推算两个日期相差天数的计算器

    2024年02月14日
    浏览(51)
  • java计算日期相差天数的4种方法

    方法1:long值相减(推荐) 方法2: 方法3: 方法4:

    2024年04月28日
    浏览(46)
  • mysql日期函数(查询最近n(天/月/年)、计算日期之间的天数等)

    mysql日期函数 目录 mysql查询最近一个月数据 返回当前日期和时间 将字符串转变为日期 日期 d 减去 n 天后的日期 计时间差,返回 datetime_expr2 − datetime_expr1 的时间差算 查询当天数据 ADDDATE(d,n) 计算起始日期 d 加上 n 天的日期 ADDTIME(t,n) n 是一个时间表达式,时间 t 加上时间表达

    2024年02月13日
    浏览(42)
  • MySQL 计算两个日期/时间之间相差的天数、分钟数、秒数...

    MySQL 中经常遇到计算两个日期或者时间之间相差的天数、周数、小时数、分钟、秒等等,下面分享一个MySQL内置的函数:TimeStampDiff() 这个函数是MySQL本身提供的可以计算两个时间间隔的函数。 语法: 返回日期或日期时间表达式 datetime_expr1 和datetime_expr2the 之间的整数差 其中

    2024年02月14日
    浏览(51)
  • java计算两个日期之间相差的天数的四种方法

    计算两个日期之间相差的天数的四种方法 第一种:时间戳的方式,计算两个日期的时间戳的差,再除当天的毫秒数即可得到相差的天数。 第二种:试用util包的Calendar类,每次增加一天,知道和结束时间相等的时候。 第三种:开始结束时间拆分为年月日,循环计算每年的天数

    2024年02月16日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包