查看原文
其他

Java算法篇—Java经典面试算法题03期

素文宅博客 Java精选 2022-08-09


01题目

有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?



程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。


程序代码如下:

package com.yoodb.util;
public class Demo01 { public static void main(String[] args) { int count = 0; for (int i = 1; i <= 4; i++) { for (int j = 1; j <= 4; j++) { for (int k = 1; k <= 4; k++) { if(i!=j && j!=k && i !=k) { count +=1; System.out.print(i+""+j+""+k + " "); } } } } System.out.println("合计" + count + "个三位数。"); }}
运行结果如下:
303 304 402 404 502 503 303 304 501 504 601 603 402 404 501 504 701 702 502 503 601 603 701 702 合计24个三位数。


02题目

企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?


程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。


程序代码如下:

package com.yoodb.util;
import java.util.Scanner;
public class Demo02 { private static Scanner s;
public static void main(String[] args) { s = new Scanner(System.in); System.out.print("请输入该月的利润:(万元)"); int I = s.nextInt(); long sum = 0;
if (I <= 100000) { sum = I / 100 * 10; } else if (I < 200000) { sum = (long) (100000 / 100 * 10 + (I - 100000) / 100 * 7.5); } else if (I < 400000) { sum = (long) (100000 / 100 * 10 + 100000 / 100 * 7.5 + (I - 200000) / 100 * 5); } else if (I < 600000) { sum = (long) (100000 / 100 * 10 + 100000 / 100 * 7.5 + 200000 / 100 * 5 + (I - 400000) / 100 * 3); } else if (I < 1000000) { sum = (long) (100000 / 100 * 10 + 100000 / 100 * 7.5 + 200000 / 100 * 5 + 200000 / 100 * 3 + (I - 600000) / 100 * 1.5); } else { sum = (long) (100000 / 100 * 10 + 100000 / 100 * 7.5 + 200000 / 100 * 5 + 200000 / 100 * 3 + 400000 / 100 * 1.5 + (I - 1000000) / 100); }
System.out.println("该月发放的奖金为:" + sum); }}

运行结果如下:

请输入该月的利润:(万元)120
该月发放的奖金为:10


03题目

一个整数,它加上100后是一个完全平方数,加上168又是一个完全平方数,请问该数是多少?


程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上168后再开方,如果开方后的结果满足如下条件,即是结果。请看具体分析:


程序代码如下:

package com.yoodb.util;
public class Demo03 {
public static void main(String[] args) { for (int i = 1; i < 1000; i++) { int m = (int) Math.sqrt((i + 100)); int n = (int) Math.sqrt((i + 100 + 168)); if (m * m == i + 100 && n * n == i + 100 + 168) { System.out.println("这个数是" + i); } } }}
运行结果如下:
这个数是21
这个数是261


04题目

输入某年某月某日,判断这一天是这一年的第几天?


程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本月的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。


程序代码如下:

package com.yoodb.util;
import java.util.GregorianCalendar;import java.util.Scanner;
public class Demo04 {
private static Scanner scan;
public static void main(String[] args) { scan = new Scanner(System.in); System.out.println("输入年份:"); int year = scan.nextInt(); System.out.println("输入月份:"); int month = scan.nextInt(); System.out.println("输入日期:"); int day = scan.nextInt(); //判断是否是闰年,GregorianCalendar:判断年份是否是闰年的方法 GregorianCalendar gre = new GregorianCalendar(); boolean isLeapYear = gre.isLeapYear(year);//返回true:是闰年,false:不是闰年
int ap = isLeapYear ? 29 : 28;//判断2月份的天数 int days = 0; switch (month) { case 1: days = day; break; case 2: days = 31 + day; break; case 3: days = 31 + ap + day; break; case 4: days = 31 + ap + 31 + day; break; case 5: days = 31 + ap + 31 + 30 + day; break; case 6: days = 31 + ap + 31 + 30 + 31 + day; break; case 7: days = 31 + ap + 31 + 30 + 31 + 30 + day; break; case 8: days = 31 + ap + 31 + 30 + 31 + 30 + 31 + day; break; case 9: days = 31 + ap + 31 + 30 + 31 + 30 + 31 + 31 + day; break; case 10: days = 31 + ap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day; break; case 11: days = 31 + ap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day; break; case 12: days = 31 + ap + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day; break;
default: System.out.println("月份输入错误!"); break; } System.out.println("这一天是这一年的第" + days + "天"); }}
运行结果如下:
输入年份:
2020
输入月份:
2
输入日期:
10
这一天是这一年的第41天


05题目

有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?


程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。


程序代码如下:

package com.yoodb.util;
public class Demo05 {
public static void main(String[] args) { int count = 0; for (int x = 1; x < 5; x++) { for (int y = 1; y < 5; y++) { for (int z = 1; z < 5; z++) { if (x != y && y != z && x != z) { count++; System.out.print(x * 100 + y * 10 + z + "\t"); if (count % 4 == 0) { System.out.println(); } } } } } System.out.println("共有" + count + "个三位数"); }}
运行结果如下:
123 124 132 134
142 143 213 214
231 234 241 243
312 314 321 324
341 342 412 413
421 423 431 432
共有24个三位数

推荐阅读

Docker(二):理解容器编排工具Kubernetes内部工作原理

Docker(一):理解Docker镜像与容器

Java算法篇—Java经典面试算法题01期

Java算法篇—Java经典面试算法题02期

Dubbo应用服务迁移到Kubernetes集成方案

JDK1.7中HashMap死环问题及JDK1.8中对HashMap的优化源码详解

Shiro权限基础篇(一):Shiro权限的基本使用方法

Shiro应用篇(二):Shiro结合Redis实现分布式环境下的Session共享

微框架Spring Boot使用Redis如何实现Session共享

Java面试高级篇—Dubbo与Zookeeper面试题16期

Java面试高级篇—Java NIO:浅析I/O模型面试题15期

Java面试高级篇—JavaIO流原理以及Buffered高效原理详解

更多推荐↓↓↓
 

关注微信公众号“Java精选”(w_z90110),回复关键词领取资料:如Hadoop,Dubbo,CAS源码等等,免费领取资料视频和项目。 


涵盖:程序人生、搞笑视频、算法与数据结构、黑客技术与网络安全、前端开发、Java、Python、Redis缓存、Spring源码、各大主流框架、Web开发、大数据技术、Storm、Hadoop、MapReduce、Spark、elasticsearch、单点登录统一认证、分布式框架、集群、安卓开发、iOS开发、C/C++、.NET、Linux、Mysql、Oracle、NoSQL非关系型数据库、运维等。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存