目录

一、计算日期到天数转换

(1)原题再现

(2)问题分析

(3)完整代码

二、幸运的袋子

(1)原题再现

(2)问题分析

(3)完整代码


一、计算日期到天数转换

(1)原题再现

计算日期到天数转换_牛客题霸_牛客网

描述

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

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

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

输入描述:

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

输出描述:

输出是这一年的第几天

示例1

输入:

2012 12 3

输出:

366

示例2

输入:

1982 3 4

输出:

63

(2)问题分析

这道题很简单。首先需要定义一个判断是否为闰年的函数,闰年是能整除400或者能够整除4却不能整除100的数。其次闰年的二月是29天。

这题有个关键的是划分输入的一串字符,将它划分成年月日,然后将String类型转换成Int类型。首先我们不能用String类的subString方法,因为月份的下标是不确定的,如果是两位数,下标就是(5,7)(左闭右开),如果是一位数就变成了(5,6),所以我们使用快慢指针法,当快指针指向空格时,我们记录从慢指针到快指针的一个字符串。将String类型转换成Int类型,我们可以使用Integer.praseInt(str)方法或者Integer.valueOf(str)方法

(3)完整代码

import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String date = sc.nextLine();int slow = 0;int fast = 1;String []str = date.split(" ", 3);String year = str[0];String month = str[1];String day = str[2];int ans = count(year, month, day);System.out.println(ans);}public static boolean isLeapYear(String year) {int year1 = Integer.parseInt(year);return year1 % 400 == 0 || (year1 % 4 == 0 && year1 % 100 != 0);}public static int chooseMonth(String year, int month) {int m = 0;switch (month) {case 1:case 3:case 5:case 7:case 8:case 10:case 12:m = 31;break;case 2:if (isLeapYear(year)) {m = 29;} else {m = 28;}break;default:m = 30;}return m;}public static int count(String year, String month, String day) {int year1 = Integer.parseInt(year);int month1 = Integer.parseInt(month);int day1 = Integer.parseInt(day);int sum = 0;if (month1 == 1) {return day1;} else {for (int i = 1; i < month1; i++) {sum += chooseMonth(year, i);}sum += day1;return sum;}}
}

二、幸运的袋子

(1)原题再现

幸运的袋子__牛客网

一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的)。如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积。
例如:如果袋子里面的球的号码是{1, 1, 2, 3},这个袋子就是幸运的,因为1 + 1 + 2 + 3 > 1 * 1 * 2 * 3
        你可以适当从袋子里移除一些球(可以移除0个,但是别移除完),要使移除后的袋子是幸运的。现在让你编程计算一下你可以获得的多少种不同的幸运的袋子。

输入描述:

第一行输入一个正整数n(n ≤ 1000)

第二行为n个数正整数xi(xi ≤ 1000)

输出描述:

输出可以产生的幸运的袋子数

示例1

输入

3

1 1 1

输出

2

(2)问题分析

这道题是有点难度的。需要用到数论+DFS深度优先搜索+搜索剪枝+回溯等方法。

数论对于任意两个正整数x,y,如果要满足x+y>x*y,则必须有一个数为1。

证明:

推广到任意i个正整数,序列中必须有1才可能满足+>*的可能,否则必然不是这样的幸运袋子

所以我们可以现将序列按照升序排序,然后分两种情况:一种是序列中没有1的情况,直接打印0,另一种是序列中有1的情况,使用DFS算法计算。

搜索剪枝:如果不进行剪枝,那么使用DFS遍历搜索会超出时间限制。剪枝的依据:如果选择一个数num能使add+num>mul*num,即满足题目要求,就继续往下搜索;如果add+num<=mul*num,即不满足题目要求,因为序列是按照升序排序的,所以也不需要往后继续添加num了,必然不符合题目要求,这时我们就可以进行剪枝,跳出这一次的循环。根据题目要求,编号一样的球没有任何区别,所以我们还要进行去重操作,比对这一位置和下一位置是否相同,相同就直接跳过这个位置的处理即可。

回溯:一组情况处理完毕了,我们需要将其结果删去,在进行下一组操作。比如,序列[1,1,2,3,4]当我们选择1,1,2,3,4时,不满足幸运袋子的要求,我们回退上一层选择的1,1,2,3,这组序列满足题目要求,此时假定位置3的情况已经全部列完了,我们就需要删除位置3的数即add(1+1+2+3-3),mul(1*1*2*3/3),然后添加位置4看看是否符合题意,add(1+1+2+4),mul(1*1*2*4)。

(3)完整代码

import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int []num = new int[n];for (int i = 0; i < n; i++) {num[i] = sc.nextInt();}Arrays.sort(num);if(num[0]==1){int ans = DFS(num, n, 1, 1, 1);System.out.println(ans);}else{System.out.println(0);}}public static int DFS(int []num, int n, int index, int add, int mul) {int count = 0;for (int i = index; i < n; i++) {add += num[i];mul *= num[i];if (add > mul) {count += 1 + DFS(num, n, i + 1, add, mul);}else {break;}add -= num[i];mul /= num[i];while (i < n - 1 && num[i] == num[i + 1]) {i++;}}return count;}
}


【Java版oj】day14计算日期到天数转换、幸运的袋子相关推荐

  1. 华为机试HJ73:计算日期到天数转换

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 根据输入的日期,计算是这一年的第几天. 输入描述: 输入一行,每行空格分割,分别是年 ...

  2. 牛客网刷题—— 计算日期到天数转换

    目录 一.描述 输入描述: 输出描述: 二.思路: 三.代码实现 点击下方链接开始做本题: 开始做题 一.描述 根据输入的日期,计算是这一年的第几天. 保证年份为4位数且日期合法. 进阶:时间复杂度: ...

  3. 华为机试HJ73-计算日期到天数转换

    HJ73 计算日期到天数转换 题目描述: 描述 根据输入的日期,计算是这一年的第几天. 保证年份为4位数且日期合法. 进阶:时间复杂度:O(n) ,空间复杂度:O(1) 输入描述: 输入一行,每行空格 ...

  4. java:获取两个日期相隔天数

    java:获取两个日期相隔天数 1 LocalDateTime使用 package com.xiaoxu.tool.demo;import org.springframework.lang.NonNu ...

  5. Excel函数之~计算日期、天数、星期

    计算日期.天数.星期的函数 1.EDATE 2.EOMONTH 3.WORKDAY 4.NETWORKDAYS 5.DATEDIF 6.YEARFRAC 7.WEEKNUM 1.EDATE 函数定义: ...

  6. php 日期 间隔,PHP实现计算日期间隔天数的方法

    这篇文章主要介绍了PHP编程计算日期间隔天数的方法,涉及php日期与时间的转换与运算相关操作技巧,需要的朋友可以参考下 刚开始在没有查PHP手册的情况下,用比较老套方法也折腾出来了,代码是这样子实现的 ...

  7. C语言计算日期间隔天数的经典算法解析

    C语言计算日期间隔天数的经典算法解析 网上看到一个计算日期间隔的方法,很高深,很巧妙.代码如下: #include <stdio.h> #include <stdlib.h> ...

  8. iOS 计算日期间隔天数 —— HERO博客

    计算两个日期间隔天数,下面贴上代码,计算指定日期与当前日期间隔天数: - (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColo ...

  9. 关于Oracle计算日期间隔天数

    最近要计算日期间隔天数,测试发现几个问题,刚开始搜网友的,有些不太靠谱. 1.首先日期不能相加. 2.如果要相减,最好去掉时分秒,格式化成年月日,直接相减的话得到的是小数,日期相减底层应该是操作的毫秒 ...

最新文章

  1. 阿里算法,浙大博士带你写项目经历!
  2. 作为iOS开发者不得不follow的52人
  3. stacking与blending的区别
  4. SSM实现个人博客-day01
  5. python源码编译 mingw_使用 MinGW 编译 C/C++ 写的 python 扩展
  6. log4j:WARN No appenders could be found for logger
  7. 【Marva Collins' Way】第三章
  8. 【华为云技术分享】iSulad轻量化容器实践解析
  9. 最早使用计算机领域,第2章 交换单元及交换网络(2.3.4).ppt
  10. 以太坊新生合约总数骤减;比特币大跌,本周主链排名震荡 | 数据周榜
  11. springboot web项目_SpringBoot 源码解析 (一):SpringBoot核心原理入门
  12. Axis2生成wsdl的一种方法
  13. 可代替 ASM,使用 AnnotationProcessor 做代码插桩
  14. html上传文件出现fakepath,IE8上传文件时获取文件本地路径问题(C:\fakepath\……)的解决...
  15. OSPF域外(外部)路由(四、五类LSA)
  16. (CVPR-2018)仔细研究用于动作识别的时空卷积
  17. html 调试502谷歌浏览器,谷歌浏览器打不开网页提示Server Error 502 Bad Gateway怎么修复?...
  18. android socket 长连接_java-socket长连接demo体验
  19. h5 nan_易企秀资深前端架构师袁飞:移动H5开发如何避坑
  20. HTML超链接怎么设置下拉菜单,html超链接怎么设置

热门文章

  1. 如果是狗,也要做一直战斗狗--三十岁的程序员
  2. 爱情保证书制作生成微信小程序源码下载
  3. gnome-screensaver
  4. java 解密 sha,如何在Java中解密sha1加密的字符串
  5. java HMACSHA1 加密解密
  6. Sha1加密是不可逆的,网上虽然有解密的方法,但只能解密很简单的密码
  7. ELK保姆级安装部署教程
  8. IPA第八届少儿模特明星盛典 濮阳赛区 海选赛圆满落幕
  9. 海马汽车经销商管理系统技术解析(十九)新增调拨
  10. MLXG发微博16个字正式宣布退役。