Java基础编程题50道题
Posted 睿图方永
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础编程题50道题相关的知识,希望对你有一定的参考价值。
1、題目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
思路:微笑刚开始真的无从下手,这么难的,怎么可以说是基础呢,感觉这些应该是逻辑分析很强的,第一个月只有一对兔子,第二个月还是只有一对兔子,第三个月,就有两对了,第四个月3对,第五个月5对,第六个月8对,第七个月是13对。。。。。。规律出来了,你们发了没?
public class TestDay01
public static void main(String[] args)
/**
* 规律是每个数字都是前面两个数字之和
* i是表示月份,这里计算了36个月,也就是三年,兔子的数量
*/
int i;
long arr[] = new long[36]; //这个数组时用来计算每月有兔子的对数
arr[0] = arr[1] = 1;
System.out.println("第1个月兔子1对" + "," + "总数是" + 2);
System.out.println("第2个月兔子1对" + "," + "总数是" + 2);
for (i = 2; i < 35; i++)
arr[i] = arr[i - 1] + arr[i - 2];
System.out.println("第" + i + "个月有兔子" + arr[i] + "对" + "," + "总数是" + 2 * arr[i]);
2、题目:判断101-200之间有多少个素数,并输出所有素数。
思路:素数又叫质数,就是除了1和它本身之外,再也没有整数能被它整除的数。也就是素数只有两个因子。
public class TestDay02
public static void main(String[] args)
int i, j, n, m, x; //n是用来存储余数的、m是用来统计具体一个数的因子、x是用来统计101~200直接素数的个数
n = 0;
m = 0;
x = 0;
for (i = 101; i < 200; i++) //两重循环
for (j = 1; j <= i; j++)
n = i % j; //去余数,如果余数为零,就是该数的因子
if (n == 0) //统计某数有多少个因子
m = m + 1;
if (m == 2) //如果某数的因子只有两个,那它就一定是素数,那这个数就应该输出
System.out.println(i + " ");
x = x + 1;
m = 0; //清零,不清了会继续累加
System.out.println();
System.out.println("在101~200之间一共有素数:" + x + "个");
3、题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
第一种:
public class TestDay03
public static void main(String[] args)
/**
* java的运算符,立方要这样写,写成i^3这样,竟然运算不出来
* 如果遇到高次的话可以使用循环算出来
*/
int a, sum; //表示100~999
int i, j, k; //分别表示百位、十位、各位
for (a = 100; a <= 999; a++)
i = a / 100;
j = (a - i * 100) / 10;
k = a - i * 100 - j * 10;
sum = i * i * i + j * j * j + k * k * k;
if (sum == a)
System.out.println(sum);
第二种:
public class TestDay03
public static void main(String[] args)
int sum;
int i,j,k; //分别表示百位、十位、各位
for (i = 1; i <=9 ; i++)
for (j = 0; j <=9 ; j++)
for (k = 0; k <=9 ; k++)
sum = i * i * i + j * j * j + k * k * k;
if (i*100+j*10+k==sum)
System.out.println(sum);
4、题目:将一个正整数分解质因数。例如:输入90,打印出90=233*5。
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
public class TestDay04
public static void main(String[] args)
int x;
Scanner scanner = new Scanner(System.in); //定义从键盘输入
System.out.println("请输出一个整数:"); //提示
x = scanner.nextInt(); //将从键盘输入的数赋值给x
new PrimeSplit(x);
private static class PrimeSplit
int k = 2; //将最小的质数赋值给K
public PrimeSplit(int x) //小于等于1的数不可以分解
if (x <= 1)
System.out.println(x + "是无效的被分解数");
else if (x == 2)
System.out.println(x + "分解后的质数为:1*" + x); //如果输入的是最小质数2
else
System.out.println(x + "分解后的质数为:1"); //1是所有的整数的质数
while (k <= x) //输入的数可以被K整除
if (x % k == 0)
System.out.println("*" + k); //将k添加到结果中
x = x / k; //除以最小质数后重新循环
else
k++;
5、题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
public class TestDay05
public static void main(String[] args)
int score = 90; //分数的值可以随便修改
if (score >= 90)
System.out.println("A");
else if (score >= 60)
System.out.println("B");
else
System.out.println("C");
6、题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
public class TestDay06
public static void main(String[] args)
gcdlcm gcdlcm = new gcdlcm();
System.out.println("两个数的最大公约数是:" + gcdlcm.gcd(10, 16));
System.out.println("两个数的最小公约数是:" + gcdlcm.lcm(10, 16));
private static class gcdlcm
int gcd(int m, int n)
if (m < n) //这个判断是为了将大数放在前面
int temp = n;
n = m;
m = temp;
if (m % n == 0)
return n;
else
m %= n;
return gcd(m, n); //这里也可以成gcd(n,m),就省掉了前面的判断了,会快一点
int lcm(int m, int n)
int i = 1;
if (m < n) //这个判断是为了将大数放在前面
int temp = n;
n = m;
m = temp;
int lcm = m;
while (lcm % n != 0)
lcm = m * i;
i++;
return lcm;
7、题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
public class TestDay07
public static void main(String[] args)
int abcCount = 0; //英文字母个数
int spaceCount = 0; //空格键个数
int numCount = 0; //数字个数
int otherCount = 0; //其他字符个数
Scanner scanner = new Scanner(System.in);
System.out.println("请输出:"); //提示
String str = scanner.nextLine();
char[] ch = str.toCharArray();
for (int i = 0; i < ch.length; i++)
if (Character.isLetter(ch[i]))
//判断是否字母
abcCount++;
else if (Character.isDigit(ch[i]))
//判断是否数字
numCount++;
else if (Character.isSpaceChar(ch[i]))
//判断是否空格
spaceCount++;
else
//以上都不是则认为是其他字符
otherCount++;
System.out.println("字母个数:" + abcCount);
System.out.println("数字个数:" + numCount);
System.out.println("空格个数:" + spaceCount);
System.out.println("其他字符个数:" + otherCount);
8、题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
public class TestDay08
public static void main(String[] args)
Scanner input = new Scanner(System.in);
int num = 0, num1 = 0, num2 = 0, temp = 0;
System.out.println("请输出数字:");
num1 = input.nextInt();
num = num1;
temp = num1;
System.out.println("请输入项数:");
num2 = input.nextInt();
for (int i = 0; i < num2; i++)
num = (num * 10 + num1);
temp += num;
System.out.println(temp);
### 9、题目:一个数如果恰好等于它的因子之和, 这个数就称为”完数”。例如6=1+2+3.编程找出1000以内的所有完数。
分析:没啥特别好分析的,注意类名尽量不要学我用拼音取名吧23333。
/**
*题目:一个数如果恰好等于它的因子之和, 这个数就称为”完数”。例如6=1+2+3.编程找出1000以内的所有完数。
*/
public class TestDay09
public static void main(String[] args)
int sum = 0;
for (int j = 2; j <= 1000; j++)
for (int i = 1; i < j; i++)
if (j % i == 0)
sum += i;
if (j == sum)
System.out.println(j);
sum = 0; // 置0留着下轮继续使用
10、题目:一球从h米高度自由落下,每次落地后反跳回原高度的一半;
再落下,求它在 第n次落地时,共经过多少米?第n次反弹多高?
分析:画个草图应该就能分析出来(本题为方便检验将高度h定位100米)。
/**
* 一球从h米高度自由落下,每次落地后反跳回原高度的一半;
*再落下,求它在 第n次落地时,共经过多少米?第n次反弹多高?
*/
public class TestDay10
public static void main(String[] args)
Scanner scanner = new Scanner(System.in);
System.out.println("请输入n");
int n = scanner.nextInt();
int sum = 100;// 本题将高度定位100
int x = 100;
int i;
for (i = 1; i < n; i++) // 3表示第三次落地
x /= 2;
sum = sum + x;
if (i == 1)
System.out.println("第" + n + "次落地反弹高度" + x / 2);
System.out.println("第" + n + "次落地经过距离" + sum);
else
System.out.println("第" + n + "次落地反弹高度" + x); // 反弹高度
System.out.println("第" + n + "次落地经过距离" + sum);
// 经过距离
11、题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
分析:别想的太复杂,利用for循环嵌套。
/**
*题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
*/
public class TestDay11
public static void main(String[] args)
int count = 0;//用来统计最终结果的个数
for (int i = 1; i < 5; i++)
for (int j = 1; j < 5; j++)
for (int k = 1; k < 5; k++)
if (i != j && i != k && j != k)
System.out.println(i + " " + j + " " + k);
count++;
System.out.println(count);
12、题目:企业发放的奖金根据利润提成。利润(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,求应发放奖金总数?
分析:算是数学应用题23333。
/**
*企业发放的奖金根据利润提成。利润(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,求应发放奖金总数?
*/
public class TestDay12
public static void main(String[] args)
Scanner s = new Scanner(System.in);
System.out.println("请输入月利润(万):");
int I = s.nextInt(); // 键盘输入利润I
if (I <= 10)
System.out.println(I * 0.1 + "万");
if (I > 10 && I <= 20)
System.out.println(1 + (I - 10) * 0.075 + "万");
if (I > 20 && I <= 40)
System.out.println(1.75 + (I - 20) * 0.05 + "万");
if (I > 40 && I <= 60)
System.out.println(2.75 + (I - 40) * 0.03 + "万");
if (I > 60 && I <= 100)
System.out.println(3.35 + (I - 60) * 0.015 + "万");
if (I > 100)
System.out.println(3.95 + (I - 100) * 0.01 + "万");
13、题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?(完全平方数:一个数=另一个数的平方,如121=11^11)。
分析:下面写的是在1-1000内找到符合题干要求的;for循环嵌套。
/**
*题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
*/
public class TestDay13
public static void main(String[] args)
int i = 0;
for (i = 1; i <= 1000; i++)
for (int k = 1; k <= 100; k++)
if (i + 100 == k * k)
// System.out.println(i + " " + k);
for (int j = 1; j < 100; j++)
if (i + 268 == j * j)
System.out.println(i);
14、题目:输入某年某月某日,判断这一天是这一年的第几天?
分析:注意平年和闰年。
/**
*输入某年某月某日,判断这一天是这一年的第几天?
*/
public class TestDay14
public static void main(String[] args)
Scanner s = new Scanner(System.in);
System.out.println("请输入年:");
int year = s.nextInt();
System.out.println("请输入月:");
int month = s.nextInt();
System.out.println("请输入日:");
int day = s.nextInt();
int sum = 0;
int[] arr = 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ;
for (int i = 0; i < month - 1; i++)
sum += arr[i];
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0 && month >= 3)
System.out.println(sum + day + 1);
else
System.out.println(sum + day);
15、题目:输入三个整数x,y,z,请把这三个数由小到大输出。
分析:程序里取巧利用了Arrays的一个现成方法直接进行从小到大排序,算是偷懒了。。。
/**
*题目:输入三个整数x,y,z,请把这三个数由小到大输出。
*/
public class TestDay15
public static void main(String[] args)
Scanner s = new Scanner(System.in);
System.out.println("請輸入整數x:");
int x = s.nextInt();
System.out.println("請輸入整數y:");
int y = s.nextInt();
System.out.println("請輸入整數z:");
int z = s.nextInt();
int[] arr = new int[3];
arr[0] = x;
arr[1] = y;
arr[2] = z;
Arrays.sort(arr); // 利用sort方法。。。。
for (int i = 0; i <= 2; i++)
System.out.print(arr[i]+" ");
16、题目:输出打印9*9口诀表。
分析:for循环嵌套,可利用"\\t"(制表符)使得输出好看些。
/**
*输出9*9口诀
*/
public class TestDay16
public static void main(String[] args)
for (int i = 1; i <= 9; i++)
for (int j = 1; j <= i; j++)
System.out.print(j + "*" + i + "=" + (j * i)+"\\t");
System.out.println();
17、题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾, 又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。 以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。 求第一天共摘了多少。
分析:利用递归。
/**
*题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,
* 又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
* 以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。 求第一天共摘了多少。
*/
public abstract class TestDay17
public static void main(String[] args)
System.out.println("第一天摘了:" + fun(10, 1));
public static int fun(int day, int num)
if (day - 1 == 0)
return num;
else
System.out.println("第" + (day - 1) + "天未吃前早上一看还有: " + ((num + 1) * 2));
return fun(day - 1, (num + 1) * 2);
18、题目:两个乒乓球队进行比赛,甲队派出a,b,c;乙队派出x,y,z三人,已抽签决定比赛名单,打听到a说他不和x比,c说他不和x,z比,请编程找出三队赛手的名单。
分析:①c说他不和x,z比,说明他只和y比; ②a说他不和x比,但是y和c比了,所以他肯定是和z比; ③那剩下的x就是和b比了
public class TestDay18
public static void main(String[] args)
String a = null, b = null, c = null;// 甲队成员
String[] racer = "x", "y", "z" ;// 乙队成员
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
for (int k = 0; k < 3; k++)
if (i != j && i != k && j != k)
a = racer[i];
b = racer[j];
c = racer[k];
if (!a.equals("x") && !c.equals("z") && !c.equals("x"))
if (a.equals(racer[i]) && b.equals(racer[j]) && c.equals(racer[k]))
System.out.println("a的对手是:" + racer[i] + ",\\nb的对手是:" + racer[j] + ",\\nc的对手是:" + racer[k]);
19、题目:打印菱形。
分析:程序以”*“为例打印,找空格和星号之间的规律联系。
/**
*题目:打印出如下图案(菱形):
* 3个空格1个*
*** 2个空格3个*
***** 1个空格5个*
******* 0个空格7个* 中间最长必为奇数
***** 1个空格5个*
*** 2个空格3个*
* 3个空格1个*
*/
public class TestDay19
public static void main(String[] args)
String str = "";
int k = 7 / 2; // 控制上半部分空格时有用
int q = 1; // 控制下半部分空格时有用
for (int i = 1; i <= 7; i++) // 控制上部分
for (int m = k; m >= 1; m--) // 控制空格
System.out.print(" ");
k--;
for (int j = i; j >= 1; j--) // 控制打印*的个数
str += "*";
System.out.println(str);
str = ""; // 防止不断累积*
i++;
for (int i = 5; i >= 1; i--) // 控制下部分
for (int n = 1; n <= q; n++) // 空格
System.out.print(" ");
if (q == 4)
break;
q++;
for (int j = i; j >= 1; j--) // 控制打印*的个数
str += "*";
System.out.println(str);
str = "";
i--;
20、题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13… 求出这个数列的前20项之和。
分析:抓住分子与分母的变化规律后累加即可,下面参考代码中还用了递归处理。
/**
*题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13… 求出这个数列的前20项之和。
*
* 程序分析:请抓住分子与分母的变化规律。分数:fraction
*/
public class TestDay20
public static void main(String[] args)
double sum = 0;
for (double i = 1; i <= 20; i++)
sum += (fun1(i) / fun2(i));
System.out.println(sum);
public static double fun1(double a) // 递归处理分子
if (a == 1)
return 2;
if (a == 2)
return 3;
else
return fun1(a - 2) + fun1(a - 1);
public static double fun2(double a) // 递归处理分母
if (a == 1)
return 1;
if (a == 2)
return 2;
else
return fun2(a - 2) + fun2(a - 1);
21、题目:求1+2!+3!+…+20!的和。
分析:累乘后累加,阶乘处理。
/**
*题目:求1+2!+3!+…+20!的和
*
* 程序分析:累乘。
*/
public class TestDay21
public static void main(String[] args)
long sum = 0;
for (int i = 1; i <= 20; i++)
sum += fun(i);
System.out.println("1+2!+3!+…+20!的和:" + sum);
public static int fun(int a)
int s = 1;
for (int i = a; a >= 1; a--)
s *= a;
return s;
22、题目:利用递归方法求5!
分析:还是递归,理解了递归的奥妙就好处理了。
/**
*题目:利用递归方法求5!。
*/
public class TestDay22
public static void main(String[] args)
int sum = 1;
sum *= fun(5);
System.out.println(sum);
public static int fun(int a)
if (a != 1)
return a * fun(a - 1);
else
return 1;
### 23、题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。 问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁 。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
分析:还是对递归的理解和使用。
/**
*题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。
* 问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁
* 。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
*/
public class TestDay23
public static void main(String[] args)
System.out.println("第五个人的岁数:" + GetAge(5, 2));
// 递归方法求第五个人的岁数
private static int GetAge(int num, int ageMore)
if (num == 1) // 第一个人岁数为10
return 10;
return GetAge(num - 1, ageMore) + ageMore;// 每上一个人岁数加2
24、题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
分析:参考程序使用.charAt方法。
/**
*给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
*/
public class TestDay24
public static void main(String[] args)
Scanner s = new Scanner(System.in);
System.out.println("请输入一个不多于5的正整数");
String str = s.nextLine();
int num = str.length();
System.out.println("该数是" + num + "位数");
String newstr = "";
for (int i = str.length() - 1; i >= 0; i--)
newstr += str.charAt(i);
System.out.println("逆序打印:" + "" + newstr);
25、题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
题目:输入一个数,判断是否为回文数 如123321, 12321等。
分析:两头开始互相比较。
/**
*输入一个数,判断是否为回文数 123321 12321
*/
public class TestDay25
public static void main(String[] args)
Scanner s = new Scanner(System.in);
System.out.println("请输入一个数:");
String str = s.nextLine();
boolean flag = false;
for (int i = 0, j = str.length() - 1; i < str.length() / 2; i++, j--)
char a = str.charAt(i);
char b = str.charAt(j);
if (a == b)
flag = true;
else
flag = false;
break;
System.out.println(flag);
26、题目:请输入星期几的第一个字母来判断一下是星期几, 如果第一个字母一样,则继续判断第二个字母。
分析:switch case 语句,参考代码以小写字母为例。
/**
*题目:请输入星期几的第一个字母来判断一下是星期几, 如果第一个字母一样,则继续判断第二个字母。
*/
public class TestDay26
public static void main(String[] args)
System.out.println("请输入第一个英文字母:");
Scanner scanner = new Scanner(System.in);
String input = scanner.next();
String input2 = "";
switch (input)
case "m":
System.out.println("Monday");
break;
case "t":
System.out.println("请输入第二个字母:");
input2 = scanner.next();
if (input2.equals("u"))
System.out.println("Tuesday");
else if (input2.equals("h"))
System.out.println("Thursday");
else
System.out.println("你输入的字母有误!");
break;
case "w":
System.out.println("Wednesday");
break;
case "f":
System.out.println("Friday");
break;
case "s":
System.out.println("请输入第二个字母:");
input2 = scanner.next();
if (input2.equals("u"))
System.out.println("Sunday");
else if (input2.equals("a"))
System.out.println("Saturday");
else
System.out.println("你输入的字母有误!");
break;
default:
System.out.println("你输入的字母不正确!");
break;
scanner.close();
27、题目:求100以内的素数。
分析:素数老生常谈了。
/**
* 题目:求100之内的素数
*/
public class TestDay27
public static void main(String[] args)
for (int i = 2; i <= 100; i++) // 被除数
boolean flag = true;
for (int j = 2; j < i; j++) // 除数
if (i % j == 0)
flag = false;
break;
if (flag == true)
System.out.println("素数有:" + i);
28、题目:对10个数进行排序。
分析:for循环,比较交换。
/**
*题目:对10个数进行排序
*/
public class TestDay28
public static void main(String[] args)
int[] arr = 7, 2, 3, 1, 9, 4, 6, 5, 8, 10 ; // 给十个数
for (int j = 0; j < arr.length - 1; j++)
int max = arr[0];
int temp = 0;
for (int i = 1; i < arr.length; i++)
if (max > arr[i])
temp = arr[i - 1];
arr[i - 1] = arr[i];
arr[i] = temp;
else
max = arr[i];
for (int i = 0; i < arr.length; i++)
System.out.println(arr[i]);
29、题目:求一个3*3矩阵对角线元素之和。
1 2 3
4 5 6
7 8 9
分析:考察二维数组。
/**
*题目:求一个3*3矩阵对角线元素之和
* 1 2 3
* 4 5 6
* 7 8 9
*/
public class TestDay29
public static void main(String[] args)
int sum = 0;
int[][] arr = 1, 2, 3 , 4, 5, 6 , 7, 8, 9 ;
for (int i = 0; i < arr.length; i++)
for (int j = 0; j < arr[i].length; j++)
if(i == j || i + j == 2) // 中间元素只加一遍!
sum += arr[i][j];
System.out.println(sum);
30、题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
分析:考察数组元素交换,参考程序原数组排序规律为从大到小。
/**
*有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
*/
public class TestDay30
static int[] arr = 9, 7, 6, 2, 1 ;
static int[] arr2 = new int[arr.length + 1];
public static void main(String[] args)
Scanner s = new Scanner(System.in);
System.out.println("请输入一个数:");
int num = s.nextInt(); // 从键盘接一个数
// 放入新数组:
arr2[0] = num;
for (int i = 1, j = 0; i <= arr.length; i++, j++)
arr2[i] = arr[j];
if (arr[0] < arr[1]) // 正序
fun();
else // 倒序
fun2();
// 正序排序操作:
public static void fun()
for (int j = 0; j < arr2.length - 1; j++)
int max = arr2[0];
int temp = 0;
for (int i = 1; i < arr2.length; i++)
if (max > arr2[i])
temp = arr2[i - 1];
arr2[i - 1] = arr2[i];
arr2[i] = temp;
else
max = arr2[i];
// 对加入新数字后的数组按原先规律操作完后输出查看
for (int i = 0; i < arr.length + 1; i++)
System.out.print(arr2[i]+" ");
// 倒序操作
public static void fun2()
for (int j = 0; j < arr2.length - 1; j++)
int min = arr2[0];
int temp = 0;
for (int i = 1; i < arr2.length; i++)
if (min < arr2[i])
temp = arr2[i - 1];
arr2[i - 1] = arr2[i];
arr2[i] = temp;
else
min = arr2[i];
// 对加入新数字后的数组按原先规律操作完后输出查看
for (int i = 0; i < arr.length + 1; i++)
System.out.print(arr2[i]+" ");
31、题目:将一个数组逆序输出。
分析:还是考察数组元素交换。
/**
* 将一个数组逆序输出
*/
public class TestDay31
public static void main(String[] args)
int[] arr = 6, 2, 4, 5, 3 ;
int temp = 0;
for (int i = 0, j = arr.length - 1; i < arr.length / 2; i++, j--)
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
for (int i = 0; i < arr.length; i++)
System.out.println(arr[i]);
32、题目:取一个整数a从右端开始的4~7位。
分析:将原来的整数到个序,转换后再求。
public class TestDay32
public static void main(String[] args)
int a = 12345;
String str = "";
String str2 = "";
str += a;
for (int i = 0; i < str.length(); i++)
str2 = str.charAt(i) + str2; // 将原数倒个序
System.out.println(str2);
for (int j = 3; j <= 6; j++)
System.out.println("第" + (j + 1) + "位為" + str2.charAt(j));// 当
33、题目:打印出杨辉三角形(要求打印出10行如下图)
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1
/**
* 1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
*/
public class TestDay33
public static void main(String[] args)
int[][] arr = new int[10][10]; //定义一个二维数组
for (int i = 0; i < 10; i++)
for (int j = 0; j < i; j++)
if (i >= 2 && j > 0)
arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
arr[i][0] = 1; //控制最左列和斜边为1
if (i == j)
arr[i][j] = 1;
System.out.println(arr[i][j] + " ");
System.out.println();
34、题目:输入3个数a,b,c,按大小顺序输出。
分析:稍微繁琐一点的数值比较。
import java.util.Scanner;
public class TestDay34
public static void main(String[] args)
Scanner scanner = new Scanner(System.in);
System.out.println("请依次请输入三个个数:");
int a = scanner.nextInt();
int b = scanner.nextInt();
int c = scanner.nextInt();
if (a > b && a > c)
System.out.println(a + " ");
if (b > c)
System.out.println(b + " " + c);
else
System.out.println(c + " " + b);
if (b > a && b > c)
System.out.println(b + " ");
if (a > c)
System.out.println(a + " " + c);
else
System.out.println(c + " " + a);
if (c > b && c > a)
System.out.println(c + " ");
if (b > a)
System.out.println(b + " " + a);
else
System.out.println(a + " " + b);
35、题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
分析:数组元素交换。
public class TestDay35
public static void main(String[] args)
int[] arr = 5, 2, 6, 7, 3; //初始化数组
boolean flag = false;
int max = arr[0], min = arr[0];
int temp = 0;
int i = 0;
for (i = 1; i < arr.length; i++) //max
if (max > arr[i])
continue;
else
max = arr[i];
for (i = 1; i < arr.length; i++) //min
if (min < arr[i])
continue;
else
min = arr[i];
for (int j = 0; j < arr.length; j++) //change max
if (arr[j] == max)
temp = arr[0];
arr[0] = arr[j];
arr[j] = temp;
for (int j = 0; j < arr.length; j++) //change min
if (arr[j] == min)
temp = arr[arr.length - 1];
arr[arr.length - 1] = arr[j];
arr[j] = temp;
System.out.println("max=" + max + " " + "min=" + min);
System.out.println("处理后的结果为:");
for (int k = 0; k < arr.length; k++)
System.out.println(arr[k]);
36、题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。
分析:还是数组元素交换处理。
public class TestDay36
public static void main(String[] args)
int[] arr = 1, 2, 3, 4, 5;
int[] arr2 = new int[5];
for (int i = 0; i < arr.length; i++)
if (i + 2 > 4)
arr2[i + 2 - 5] = arr[i];
else
arr2[i + 2] = arr[i];
for (int j = 0; j < arr2.length; j++)
System.out.println(arr2[j] + " ");
### 37、题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
分析:数组,循环。
public class TestDay37
public static void main(String[] args)
int[] arr = 1, 2, 3, 4, 5;
int count = 0;
int sum = 0;
for (int i = 0; i < arr.length; i++)
if (arr[i] != 0)
count++;
if (count % 3 == 0 && arr[i] != 0)
arr[i] = 0;
if (i == 4)
i = -1;
if (count == 12)
break;
for (int j = 0; j < arr.length; j++)
System.out.println(arr[j] + " ");
38、题目:写一个函数,求一个字符串的长度, 在main函数中输入字符串,并输出其长度。
分析:算实考察方法调用吧。。。
public class TestDay38
public static void main(String[] args)
Scanner scanner = new Scanner(System.in);
System.out.println("请输入字符串:");
String str = scanner.nextLine();
System.out.println("字符串长度为:" + fun(str));
private static int fun(String str)
int length = str.length();
return length;
39、题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+…+1/n, 当输入n为奇数时,调用函数1/1+1/3+…+1/n(利用指针函数)。
分析:注意int和double吧。
public class TestDay39
public static void main(String[] args)
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个数:");
int num = scanner.nextInt();
System.out.println(fun(num));
private static double fun(int num)
double sum = 0;
if (num % 2 == 0)
for (int i = 2; i <= num; i += 2)
sum += (double) 1 / i;
return sum;
else
for (int i = 1; i <= num; i += 2)
sum += (double) 1 / i;
return sum;
### 40、题目:按字符串的长度和字母ASKII顺序排序。
分析:compareTo方法的使用。
public class TestDay40
public static void main(String[] args)
String[] str = "fb", "abaac", "abaa", "fc", "fa";
for (int i = str.length - 1; i >= 1; i++)
for (int j = 0; j <= i - 1; j++)
if (str[j].compareTo(str[j + 1]) < 0)
String temp = str[j];
str[j] = str[j + 1];
str[j + 1] = temp;
for (String subStr : str)
System.out.println(subStr + " ");
System.out.println();
41、题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个, 这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份, 又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
分析:还是递归的理解和使用。
public class TestDay41
public static void main(String[] args)
fun(5, 6);
private static void fun(int monkynum, int peachnum)
if (monkynum != 0)
fun(monkynum - 1, peachnum * 5 + 1);
System.out.println(monkynum + " " + peachnum);
else
System.out.println(monkynum + " " + peachnum);
42、题目:809??=800??+9??+1 ??代表两位数;8??的结果为两位数,9??的结果为三位数。 求??代表的两位数,及809??后的结果。
分析:算是数学题吧。
public class TestDay42
public static void main(String[] args)
int x;
for (x = 0; ; x++)
if (x >= 1.25 && x < 12.5 && 9 * x >= 100 && 9 * x < 1000)
System.out.println(x);
break;
System.out.println(809 * x);
43、题目:求0-7所能组成的奇数的个数。
分析:下面参考程序为简单粗暴的for循环
public class TestDay43
static int[] arr = 0, 1, 2, 3, 4, 5, 6, 7;
public static void main(String[] args)
long count = 0;
int I = 10000000, J = 1000000, K = 100000, M = 10000, N = 1000, X = 100, Y = 10;
for (int i = 0; i < arr.length; i++)
for (int j = 0; j < arr.length; j++)
for (int k = 0; k < arr.length; k++)
for (int m = 0; m < arr.length; m++)
for (int n = 0; n < arr.length; n++)
for (int x = 0; x < arr.length; x++)
for (int y = 0; y < arr.length; y++)
for (int z = 0; z < arr.length; z++)
long a = arr[i] * I + arr[j] * J + arr[k] * K + arr[m] * M + arr[n] * N + arr[x] * X + arr[y] * Y + arr[z];
if (a % 2 == 1)
count++;
System.out.println(count);
44、题目:一个偶数总能表示为两个素数之和。
分析:基本还是算考察素数。
public class TestDay44
public static void main(String[] args)
int num = 20; //一个偶数
int[] arr = new int[num]; //定义一个数组放找到的所有素数
int k = 0; //控制数组下标
/**
* 求num以内的所有素数:
*/
boolean flag = true;
for (int a = 0; a < num; a++)
for (int i = 2; i < a; i++)
if (a % i == 0)
flag = false;
break;
if (flag)
System.out.println(a); //打印看看有哪些是素数
arr[k] = a;
k++;// 是素数放进数组
else
flag = true;
System.out.println("-----------------");
/**
* 遍历查看数组中的素数并寻找满足加和为偶数的两个素数:
*/
for (int i = 0; i < arr.length; i++)
for (int j = 0; j < arr.length; j++)
System.out.println(arr[i] + " " + arr[j]);
45、题目:字符串连接。
分析:字符串直接通过+号连接。
public class TestDay45
public static void main(String[] args)
String s1 = "Hello";
String s2 = "World";
String s3 = s1 + s2;
System.out.println(s3);
46、题目:输入一个数(1-50),程序打印该数数量的*号。
分析:方法调用,for循环。
public class TestDay46
public static void main(String[] args)
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个1-50的数:");
int num = scanner.nextInt();
fun(num);
private static void fun(int num)
for (int i = 1; i <= num; i++)
System.out.println("*----" + i);
47、题目:计算字符串中子串出现的次数。
分析:下面参考程序使用了charAt()方法。
public class TestDay47
public static void main(String[] args)
int count = 0;
String string = "Hello World! How are you?";
for (int i = 0; i < string.length(); i++)
if (string.charAt(i) == ' ')
count++;
System.out.println(count);
48、题目:输入一个整数后打印(金字塔):假如输入4打印如下:
1
121
12321
1234321
分析:找规律,注意空格即可。
public class TestDay48
public static void main(String[] args)
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个数:");
int n = scanner.nextInt();
for (int i = 1; i < n; i++) //控制行数
for (int j = n - i; j >= 0; j--) //控制空格
System.out.println(' ');
for (int k = 1; k <= 1; k++) //控制正序
System.out.println(k);
for (int q = i - 1; q >= 1; q--) //控制倒序
System.out.println(q);
System.out.println();
49、题目:输入一个整数打印,假如输入4打印如下:
1 2 3 4
8 7 6 5
9 10 11 12
16 15 14 13
分析:找规律,注意走S型。
public class TestDay49
public static void main(String[] args)
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个数:");
int n = scanner.nextInt(); //获取行数
int x = 0, k;
for (int i = 0; i < n; i++) //控制行数
if (i == 1) //控制第一行
for (int j = 1; j <= n; j++)
System.out.println(j + "\\t");
x = j;
if (i != 1 && i % 2 == 0) //控制双数行
for (k = x + n; k >= x + 1; k--)
System.out.println(k + "\\t");
x = k + n;
if (i != 1 && i % 2 == 1) //控制单数行
for (k = x + 1; k <= x + n; k++)
System.out.println(k + "\\t");
x = k - 1;
System.out.println();
50、题目:有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,况原有的数据和计算出的平均分数存放在磁盘文件"stud"中。
public class TestDay50
//定义学生模型
String[] number = new String[5];
String[] name = new String[5];
float[][] grade = new float[5][3];
float[] sum = new float[5];
public static void main(String[] args) throws IOException
TestDay50 stud = new TestDay50();
stud.input();
stud.output();
private void input() throws IOException
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
boolean isRecord = true;
while (isRecord)
try
for (int i = 0; i < 5; i++)
System.out.println("请输入学号:");
number[i] = br.readLine();
System.out.println("请输入名字:");
name[i] = br.readLine();
for (int j = 0; j < 3; j++)
System.out.println("请输入第" + (j + 1) + "门课成绩:");
grade[i][j] = Integer.parseInt(br.readLine());
System.out.println();
sum[i] = grade[i][0] + grade[i][1] + grade[i][2];
isRecord = false;
catch (NumberFormatException e)
System.out.println("请输入一个数字:");
/**
* 输出文件
*/
private void output() throws IOException
FileWriter fw = new FileWriter("D://java50//stud.txt");
BufferedWriter bw = new BufferedWriter(fw);
bw.write("No. " + "Name " + "grade1 " + "grade2 " + "grade3 " + "average");
bw.newLine();
for (int i = 0; i < 5; i++)
bw.write(number[i]);
bw.write(" " + name[i]);
for (int j = 0; j < 3; j++)
bw.write(" " + grade[i][j]);
bw.write(" " + (sum[i] / 5));
bw.newLine();
bw.close();
干货 | 美团 Java 面试 154 道题分享!
-
Java集合22题 -
JVM与调优21题 -
并发编程28题 -
spring 25题 -
设计模式 10题 -
springboot 22题 -
Netty10题 -
Redis 16题
Java集合22题
-
ArrayList 和 Vector 的区别。 -
说说 ArrayList,Vector, LinkedList 的存储性能和特性。 -
快速失败 (fail-fast) 和安全失败 (fail-safe) 的区别是什么? -
hashmap 的数据结构。 -
HashMap 的工作原理是什么? -
Hashmap 什么时候进行扩容呢? -
List、Map、Set 三个接口,存取元素时,各有什么特点? -
Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用 == 还是 equals()? 它们有何区别? -
两个对象值相同 (x.equals(y) == true),但却可有不同的 hash code,这句话对不对? -
heap 和 stack 有什么区别。 -
Java 集合类框架的基本接口有哪些? -
HashSet 和 TreeSet 有什么区别? -
HashSet 的底层实现是什么? -
LinkedHashMap 的实现原理? -
为什么集合类没有实现 Cloneable 和 Serializable 接口? -
什么是迭代器 (Iterator)? -
Iterator 和 ListIterator 的区别是什么? -
数组 (Array) 和列表 (ArrayList) 有什么区别?什么时候应该使用 Array 而不是 ArrayList? -
Java 集合类框架的最佳实践有哪些? -
Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用 == 还是 equals()?它们有何区别? -
Comparable 和 Comparator 接口是干什么的?列出它们的区别 -
Collection 和 Collections 的区别。
JVM与调优21题
-
Java 类加载过程? -
描述一下 JVM 加载 Class 文件的原理机制? -
Java 内存分配。 -
GC 是什么? 为什么要有 GC? -
简述 Java 垃圾回收机制 -
如何判断一个对象是否存活?(或者 GC 对象的判定方法) -
垃圾回收的优点和原理。并考虑 2 种回收机制 -
垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? -
Java 中会存在内存泄漏吗,请简单描述 -
深拷贝和浅拷贝。 -
System.gc() 和 Runtime.gc() 会做什么事情? -
finalize() 方法什么时候被调用?析构函数 (finalization) 的目的是什么? -
如果对象的引用被置为 null,垃圾收集器是否会立即释放对象占用的内存? -
什么是分布式垃圾回收(DGC)?它是如何工作的? -
串行(serial)收集器和吞吐量(throughput)收集器的区别是什么? -
在 Java 中,对象什么时候可以被垃圾回收? -
简述 Java 内存分配与回收策率以及 Minor GC 和 Major GC。 -
JVM 的永久代中会发生垃圾回收么? -
Java 中垃圾收集的方法有哪些? -
什么是类加载器,类加载器有哪些? -
类加载器双亲委派模型机制?
并发编程28题
-
Synchronized 用过吗,其原理是什么? -
你刚才提到获取对象的锁,这个“锁”到底是什么?如何确定对象的锁? -
什么是可重入性,为什么说 Synchronized 是可重入锁? -
JVM 对 Java 的原生锁做了哪些优化? -
为什么说 Synchronized 是非公平锁? -
什么是锁消除和锁粗化? -
为什么说 Synchronized 是一个悲观锁?乐观锁的实现原理又是什么?什么是 CAS,它有什么特性? -
乐观锁一定就是好的吗? -
跟 Synchronized 相比,可重入锁 ReentrantLock 其实现原理有什么不同? -
那么请谈谈 AQS 框架是怎么回事儿? -
请尽可能详尽地对比下 Synchronized 和 ReentrantLock 的异同。 -
ReentrantLock 是如何实现可重入性的? -
除了 ReetrantLock,你还接触过 JUC 中的哪些并发工具? -
请谈谈 ReadWriteLock 和 StampedLock。 -
如何让 Java 的线程彼此同步?你了解过哪些同步器?请分别介绍下。 -
CyclicBarrier 和 CountDownLatch 看起来很相似,请对比下呢? -
Java 线程池相关问题 -
Java 中的线程池是如何实现的? -
创建线程池的几个核心构造参数? -
线程池中的线程是怎么创建的?是一开始就随着线程池的启动创建好的吗? -
既然提到可以通过配置不同参数创建出不同的线程池,那么 Java 中默认实现好的线程池又有哪些呢?请比较它们的异同 -
如何在 Java 线程池中提交线程? -
什么是 Java 的内存模型,Java 中各个线程是怎么彼此看到对方的变量的? -
请谈谈 volatile 有什么特点,为什么它能保证变量对所有线程的可见性? -
既然 volatile 能够保证线程间的变量可见性,是不是就意味着基于 volatile 变量的运算就是并发安全的? -
请对比下 volatile 对比 Synchronized 的异同。 -
请谈谈 ThreadLocal 是怎么解决并发安全的? -
很多人都说要慎用 ThreadLocal,谈谈你的理解,使用 ThreadLocal 需要注意些什么?
spring 25题
-
什么是 Spring 框架?Spring 框架有哪些主要模块? -
使用 Spring 框架能带来哪些好处? -
什么是控制反转(IOC)?什么是依赖注入? -
请解释下 Spring 框架中的 IoC? -
BeanFactory 和 ApplicationContext 有什么区别? -
Spring 有几种配置方式? -
如何用基于 XML 配置的方式配置 Spring? -
如何用基于 Java 配置的方式配置 Spring? -
怎样用注解的方式配置 Spring? -
请解释 Spring Bean 的生命周期? -
Spring Bean 的作用域之间有什么区别? -
什么是 Spring inner beans? -
Spring 框架中的单例 Beans 是线程安全的么? -
请举例说明如何在 Spring 中注入一个 Java Collection? -
如何向 Spring Bean 中注入一个 Java.util.Properties? -
请解释 Spring Bean 的自动装配? -
请解释自动装配模式的区别? -
如何开启基于注解的自动装配? -
请举例解释@Required 注解? -
请举例解释@Autowired 注解? -
请举例说明@Qualifier 注解? -
构造方法注入和设值注入有什么区别? -
Spring 框架中有哪些不同类型的事件? -
FileSystemResource 和 ClassPathResource 有何区别? -
Spring 框架中都用到了哪些设计模式?
设计模式 10题
-
请列举出在 JDK 中几个常用的设计模式? -
什么是设计模式?你是否在你的代码里面使用过任何设计模式? -
Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式 -
在 Java 中,什么叫观察者设计模式(observer design pattern)? -
使用工厂模式最主要的好处是什么?在哪里使用? -
举一个用 Java 实现的装饰模式(decorator design pattern)?它是作用于对象层次还是类层次? -
在 Java 中,为什么不允许从静态方法中访问非静态变量? -
设计一个 ATM 机,请说出你的设计思路? -
在 Java 中,什么时候用重载,什么时候用重写? -
举例说明什么情况下会更倾向于使用抽象类而不是接口
springboot 22题
-
什么是 Spring Boot? -
Spring Boot 有哪些优点? -
什么是 JavaConfig? -
如何重新加载 Spring Boot 上的更改,而无需重新启动服务器? -
Spring Boot 中的监视器是什么? -
如何在 Spring Boot 中禁用 Actuator 端点安全性? -
如何在自定义端口上运行 Spring Boot 应用程序? -
什么是 YAML? -
如何实现 Spring Boot 应用程序的安全性? -
如何集成 Spring Boot 和 ActiveMQ? -
如何使用 Spring Boot 实现分页和排序? -
什么是 Swagger?你用 Spring Boot 实现了它吗? -
什么是 Spring Profiles? -
什么是 Spring Batch? -
什么是 FreeMarker 模板? -
如何使用 Spring Boot 实现异常处理? -
您使用了哪些 starter maven 依赖项? -
什么是 CSRF 攻击? -
什么是 WebSockets? -
什么是 AOP? -
什么是 Apache Kafka? -
我们如何监视所有 Spring Boot 微服务?
Netty10题
-
BIO、NIO和AIO的区别? -
NIO的组成? -
Netty的特点? -
Netty的线程模型? -
TCP 粘包/拆包的原因及解决方法? -
了解哪几种序列化协议? -
如何选择序列化协议? -
Netty的零拷贝实现? -
Netty的高性能表现在哪些方面? -
NIOEventLoopGroup源码?
Redis 16题
-
什么是redis? -
Reids的特点 -
Redis支持的数据类型 -
Redis是单进程单线程的 -
虚拟内存 -
Redis锁 -
读写分离模型 -
数据分片模型 -
Redis的回收策略 -
使用Redis有哪些好处? -
redis相比memcached有哪些优势? -
redis常见性能问题和解决方案 -
MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据 -
Memcache与Redis的区别都有哪些? -
Redis 常见的性能问题都有哪些?如何解决? -
Redis 最适合的场景
以上是关于Java基础编程题50道题的主要内容,如果未能解决你的问题,请参考以下文章