原创

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

题目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*100+j*100+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个三位数
~阅读全文~人机检测~

关注下方微信公众号“Java精选”(w_z90110),回复关键词领取资料:如Mysql、Hadoop、Dubbo、Spring Boot等,免费领取视频教程、资料文档和项目源码。

Java精选专注程序员推送一些Java开发知识,包括基础知识、各大流行框架(Mybatis、Spring、Spring Boot等)、大数据技术(Storm、Hadoop、MapReduce、Spark等)、数据库(Mysql、Oracle、NoSQL等)、算法与数据结构、面试专题、面试技巧经验、职业规划以及优质开源项目等。其中一部分由小编总结整理,另一部分来源于网络上优质资源,希望对大家的学习和工作有所帮助。

评论

分享:

支付宝

微信