Java 经典算法笔试面试题目十题
以下十个题目为本人总结的一些曾经碰到过的Java算法题目,为原创内容,如有错误或者不足之处,欢迎指正,欢迎转载,转载请注明出处。
package java_algorithm;
import java.util.Scanner;
/**
* 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
* 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
* (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
* (2)如果nk,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
* (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
* @author yqt
*
*/
public class DivideNum {
public static void solution(int n){
int k = 2;
int temp = 0;
while(k<=n){
if(k==n){
System.out.println(k);
break;
}else if(k
package java_algorithm;
import java.util.ArrayList;
import java.util.List;
/**
* 题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。
* 例如6=1+2+3.编程找出1000以内的所有完数。
* 程序分析:关键是找出数的所以因子,注意因子包含1!不包含本身,但是1不是完数。
* @author yqt
*/
public class EntirelyNum {
public static void solution(){
int s = 0;
List
list = new ArrayList
();
for(int i=2;i<1001;i++){
s = i;
for(int j=1;j
package java_algorithm;
/**
* 斐波那契数列问题:返回第n项的值
* @author yqt
*/
import java.util.*;
public class Fibonacci {
//递归调用,但是时间复杂度过高,重复计算
public int solutionOne(int n) {
if(n<0)
return -1;
if(n==0)
return 0;
if(n==1||n==2)
return 1;
return solutionOne(n-2)+solutionOne(n-1);
}
//循环,时间复杂度为n
public int solutionTwo(int n) {
int a=1,b=1,c=0;
if(n<0){
return 0;
}else if(n==1||n==2){
return 1;
}else{
for (int i=3;i<=n;i++){
c=a+b;
a=b;
b=c;
}
return c;
}
}
public static void main(String[] args){
Fibonacci s=new Fibonacci();
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
System.out.println(s.solutionOne(n));
sc.close();
}
}
package java_algorithm;
import java.util.Scanner;
/**
* 题目:一个n位数,判断它是不是回文数。
* 例如:12321是回文数,12345则不是。
* @author yqt
*
*/
public class PalindromeNum {
public static boolean solution(int num){
String str = String.valueOf(num);
boolean flag = true;
for(int i=0;i
package java_algorithm;
/**
* 高效率幂运算: 递归算法
* @author yqt
*/
public class PowerCal {
public static void main(String[] args) {
long num=pow(4,4);
System.out.println(num);
}
public static long pow(long x,int n){
if(n==0)
return 1;
if(n==1)
return x;
if(isEven(n))
return pow(x*x,n/2);
else
return pow(x*x,n/2)*x;
}
private static boolean isEven(int n) {
if(n%2==0)
return true;
else
return false;
}
}
package java_algorithm;
/**
* 题目:判断101-200之间有多少个素数,并输出所有素数。
* 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
* @author yqt
*
*/
public class PrimeNum {
public static void solution(){
boolean flag = true;
int count = 0;
for(int i=101;i<200;i++){
for(int j=2;j<=Math.sqrt(i);j++){
if(i%j==0){
flag = false;
break;
}
}
if(flag){
System.out.print(i+" ");
count++;
}
if(count%10==0)
System.out.println();
flag = true;
}
}
public static void main(String[] args) {
solution();
}
}
package java_algorithm;
/**
* 欧几里得算法
* 求最大公约数
* 定理:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。
* 最大公约数(greatest common divisor)缩写为gcd。
* @author yqt
*/
public class PublicSum {
public static void main(String[] args) {
int num=divisor(60, 43);
System.out.println(num);
}
//循环
public static long maxPublicSum(long m,long n){
while(n!=0){
long rem=m%n;
m=n;
n=rem;
}
return m;
}
//递归
public static int divisor(int m,int n)
{
if (m % n == 0) {
return n;
}
else {
return divisor(n,m % n);
}
}
}
package java_algorithm;
/**
*
* 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。
* 例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
* @author yqt
*
*/
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class SameNumSum {
public static int solution(int n,int a){
int an = 0;
int sn = 0;
List
list = new ArrayList
();
for(int i=0;i
package java_algorithm;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
* 程序分析:利用while语句,条件为输入的字符不为'\n'。
* @author yqt
*/
public class StatisticChar {
public static void solution(String str){
int countNum = 0;
int countChar = 0;
int countSpace = 0;
int countOthers = 0;
for(int i=0;i
='0'&&ch<='9')
countNum++;
else if(ch>='a'&&ch<='z')
countChar++;
else if(ch==' ')
countSpace++;
else
countOthers++;
}
System.out.println("数字个数:"+countNum);
System.out.println("英文字母个数:"+countChar);
System.out.println("空格个数:"+countSpace);
System.out.println("其他字符个数:"+countOthers);
}
public static void main(String[] args) throws IOException {
//标准键盘录入方式
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String str = bufr.readLine();
solution(str);
bufr.close();
}
}
package java_algorithm;
/**
* 题目:打印出100-999所有的"水仙花数",并打印出所有水仙花数之和。
* 所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。
* 例如:153是一个"水仙花数"
* 因为153=1的三次方+5的三次方+3的三次方。
* 程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
* @author yqt
*
*/
public class WaterFlouwer {
public static void solution(){
int sum = 0;
for(int i=100;i<1000;i++){
if(isFlouwerNum(i)){
System.out.println(i);
sum+=i;
}
}
System.out.println(sum);
}
private static boolean isFlouwerNum(int i) {
int aaa = i/100;
int aa = i%100/10;
int a = i%100%10;
return (Math.pow(aaa, 3)+Math.pow(aa, 3)+Math.pow(a, 3))==i;
}
public static void main(String[] args) {
solution();
}
}