java面试算法与设计(基础)

1、打印出100以内的素数:

代码:

package com.loan.controller;

public class Arithmetic {
 public static void main(String[] args){
	 getPrimes(100);//1
 }
  /**
 * 1、打印出100以内的素数
 */
 public static void getPrimes(int maxNum){
	 String s=maxNum+"以内的素数有:";
	 for(int i=2;i<=maxNum;i++){
		 if(isPrime(i)){
			 s+=i+",";
		 }
	 }
	 System.out.println(s.subSequence(0, s.length()-1));
 }
 
/**
 * 判断某个数是否为素数
 * @param num
 * @return
 */
public static boolean isPrime(int num){
	  for(int i=2;i<=Math.sqrt(num);i++){
		  if(num%i==0){
			  return false;
		  }
	  }
	  return true;
  }
}

结果:

2、打印九九乘法表:

代码:

/**
 * 打印九九乘法表
 */
public static void NineNineMuiltTable(){
	for(int i=1;i<10;i++){
		for(int j=1;j<=i;j++){
			System.out.print(i+"*"+j+"="+i*j+"\t");
		}
		System.out.println();
	}
}

结果:

3、打印10000以内的回文数字:

代码:
/**
 * 打印10000以内的回文数字
 */
public static void circleNum(int maxNum){
	String s=maxNum+"以内的回文数字有:\n";
	int count=0;
	for(int i=11;i<maxNum;i++){
		if(isCircleNum(i)){
			count++;
			 if(count%10==0){
				 s+=i+"\n";
			 }
			 else{
				 s+=i+",";
			 }
		}
	}
	System.out.println(s);
}
public static boolean isCircleNum(int num){
	int oldNum=num;
	int reverseNum=0;
	while(num>0){
		reverseNum=reverseNum*10+num%10;
		num=num/10;
	}
	if(oldNum==reverseNum){
		return true;
	}
	return false;
}


结果:

4、获取任意一个时间的下一天的时间:

代码:
public static void main(String[] args) throws ParseException{
	 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	 Date date=sdf.parse("2018-8-25 14:25:58");
	 getNextDay(date,30);
}
/**
 * 获取任意一个时间的下n天的时间
 */
public static void getNextDay(Date date,int n){
	SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	long times=date.getTime();
	//一天时间的时间戳
	long addTime=n;
	addTime*=24;
	addTime*=60;
	addTime*=60;
	addTime*=1000;
	//增加一天后的时间戳
	long nextTimes=times+addTime;
	System.out.println(sdf.format(date)+"的下"+n+"天的日期是:"+sdf.format(new Date(nextTimes)));
	
}

结果:

5、冒泡排序:

代码:
注:数组copy用 :System.arraycopy(a, 0, b, 0, a.length);
 
public static void main(String[] args) throws ParseException{
	 int a[]={5,1,3,2,4,6,0,7,2,9,10,8};
	 maopaoSort(a);
}
/**
 * 冒泡排序
 * @param a
 */
public static void maopaoSort(int a[]){
	int[] b=new int[a.length];
	System.arraycopy(a, 0, b, 0, a.length);
	for(int i=0;i<a.length;i++){
		for(int j=i;j<a.length;j++){
			int temp=0;
			if(a[i]>a[j]){
				temp=a[i];
				a[i]=a[j];
				a[j]=temp;
			}
		}
	}
	String s="原数组:";
	for(int bb:b){
		s+=bb+",";
	}
	s+="冒泡排序之后的结果:";
	for(int aa:a){
		s+=aa+",";
	}
	System.out.println(s);
	
}



结果:


6、插入排序:

代码:
public static void main(String[] args) throws ParseException{
	 int a[]={5,1,3,2,4,6,0,7,2,9,10,8};
	 insertSort(a);
}
/**
 * 插入排序
 * @param a
 */
public static void insertSort(int[] a){
	int[] b=new int[a.length];
	System.arraycopy(a, 0, b, 0, a.length);
	for(int i=0;i<a.length;i++){
		int temp=a[i];
		for(int j=i;j>0;j--){
			if(temp<a[j-1]){
				a[j]=a[j-1];
				a[j-1]=temp;
			}
			else{
				break;
			}
		}
	}
	String s="原数组:";
	for(int bb:b){
		s+=bb+",";
	}
	s+="插入排序之后的结果:";
	for(int aa:a){
		s+=aa+",";
	}
	System.out.println(s);
}

结果:


7、快速排序:

代码:

public static void main(String[] args) throws ParseException{
	 int a[]={5,1,3,2,4,6,0,7,2,9,10,8};
	 System.out.println("原数组:");
	 print(a);
	 quickSort(a,0,11);
	 System.out.println();
	 System.out.println("快速排序后数组:");
	 print(a);
}
public static void print(int a[]){
	for(int aa:a){
		System.out.print(aa+",");
	}
} 
/**
 * 快速排序
 * @param a
 * @param low
 * @param high
 */
public static void quickSort(int a[],int low,int high){
	if(low>=high){//low小于high直接返回
		return;
	}
	else if(high-low==1){//只有两个数,直接排序
		if(a[high]<a[low]){
			swap(a,a[high],a[low]);
		}
		return;
	}
	else{
		int pivot=a[low];//最小的设置为中间值
		int left=low+1;//左滑块值从第二个值开始
		int right=high;//又滑块从最后一个值开始
		while(left<right){//左右循环
			while(left<right){//向右循环,找出一个大于中间值的数,记录下标为left
				if(a[left]>pivot){
					break;
				}
				left++;
			}
			while(left<=right){//向左循环,找出小于中间值的数,记下下标right
				if(a[right]<pivot){
					break;
				}
				right--;
			}
			if(left<right){//将找到的left,right值进行交换
				swap(a,left,right);
			}
		}
		swap(a,low,right);//交换中间值,因为low已经作为过中间值了,此时low为左边数组中的最大值放到最后。
		quickSort(a,low,right);//左边数组快速排序
		quickSort(a,right+1,high);//右边数组快速排序
	}
}
public static void swap(int[] arr,int a,int b){
	int temp=arr[a];
	arr[a]=arr[b];
	arr[b]=temp;
}

结果:


8、N个人围成圈,数到K和K的倍数时出圈,最后剩下的人原来的位置是?

代码:
public static void main(String[] args) throws ParseException{
	 cycle(50,3);
}
public static void cycle(int total,int k){
	List<Integer> list=new LinkedList<Integer>();
	for(int i=0;i<total;i++){
		list.add(i+1);
	}
	int index=-1;
	while(list.size()>1){
		index=(index+k)%list.size();
		list.remove(index--);//出圈后,出圈元素之后的数据都会前移,所以下标-1 
	}
	System.out.println(total+"个人围成圈,数到"+k+"和"+k+"的倍数时出圈,最后剩下的人原来的位置是:"+list.get(0));
}

结果:

另外:

//求阶乘之和
	private static int getJC(int m,int n){
		int s=0;
		for(int i=m;i<n+1;i++){
			int temp=1;
			for(int j=1;j<i;j++){
				temp*=j;
			}
			s+=temp;
		}
		return s;
		
	}
	//判断是否为闰年
	private static boolean checkIsRunYear(int year){
		if((year%4==0&&year%100!=0)||(year%400==0)){
			return true;
		}
		else{
			return false;
		}
		
	} 
	//兔子问题 month 月数 type 一次生几对兔子
	private static int num(int month,int type){
		if(month==1||month==2){
			return 1;
		}
		else{
//			System.out.println(num(month-1,type)+num(month-2,type)*type);
			return num(month-1,type)+num(month-2,type)*type;
		}
	}
	//查找水仙花数
	private static void findsxh(){
		for(int i=100;i<1000;i++){
			int h=i/100;
			int s=(i%100)/10;
			int g=(i%100)%10;
			if((int)((int)Math.pow(h, 3)+(int)Math.pow(s, 3)+(int)Math.pow(g, 3))==i){
				System.out.println(i+"是水仙花数");
			}
		}
	}
	//【程序4】Explode.java  题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
	private static void explode(int n){
		String s=n+"=";
		List list=new ArrayList();
		if(isPrime(n)){
			System.out.println("本身就是质数:"+n);
		}
		else{
			for(int i=2;i<=n/2;i++){
				if(isPrime(i)){
					list.add(i);
				}
			}
			int m=0;
			for(int j=0;j<list.size();j++){
				System.out.println("质数:"+list.get(j));
				if(n%((int)list.get(j))==0){
					s+=list.get(j)+"*";
					m=n/((int)list.get(j));
					while(m%((int)list.get(j))==0){
						s+=list.get(j)+"*";
						m/=((int)list.get(j));
					}
				}
			}
			if(s.endsWith("*")){
				s=s.substring(0, s.length()-1);
			}
			System.out.println("分解后结果为"+s);
		}
	}
	//利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示
	private static void conditionOperator(int grade){
		System.out.println(grade>=90?"A":(grade>=60?"B":"C"));
	}
	//题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 
	private static void maxMin(int a,int b){
		int max=a>b?a:b;
		int min=a<b?a:b;
		for(int i=min;i>0;i--){
			if((a%i==0)&&(b%i==0)){
				System.out.println("最大公约数:"+i);
				break;
			}
		}
		for(int i=max;i<=a*b;i++){
			if((i%a==0)&&(i%b==0)){
				System.out.println("最小公倍数:"+i);
				break;
			}
		}
	}
	//题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
	private static void stChar(String s){
		System.out.println("字符总数:"+s.length());
		char[] ch=s.toCharArray();
		int c=0;
		int k=0;
		int sz=0;
		int o=0;
		for(int i=0;i<ch.length;i++){
			if((ch[i]>='a'&&ch[i]<='z')||(ch[i]>='A'&&ch[i]<='Z')){
				c++;
			}
			else if(ch[i]==' '){
				k++;
			}
			else if(ch[i]>='0'&&ch[i]<='9'){
				sz++;
			}
			else{
				o++;
			}
		}
		System.out.println("英文字符数:"+c+"空格数:"+k+"数字数:"+sz+"其他字符:"+o);
	}
	//题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
	private static void testAdd(int n,int a){
		int s=0;
		String sc="";
		for(int i=1;i<=n;i++){
			if(i!=1){
				sc+="+";
			}
			int sum=0;
			for(int k=i-1;k>=0;k--){
				sum+=Math.pow(10, k);
				sc+=a;
			}
			s+=a*sum;
		}
		System.out.println(s+"="+sc);
	}
	//题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数
	private static  void wanshu(int n){
		List a=new ArrayList();
		for(int i=2;i<n+1;i++){
			//求出所有质数
				if(isPrime(i)){
					a.add(i);
				}
		}
		for(int j=2;j<n+1;j++){
			int zszh=1;
			int m=0;
			String s=j+"=";
			for(int k=0;k<a.size();k++){
				int zs=(int)(a.get(k));
				if(j%zs==0) {
					zszh+=zs;
					s+=zs+"+";
					m=j/zs;
					while(m%zs==0){
						zszh+=zs;
						s+=zs+"+";
						m/=zs;
					}
				}
			}
			if(zszh==j){
				System.out.println(j);
			}
		}
	}
	//题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
	private static void pro10(int height,int n){
		int s=0;
		for(int i=0;i<9;i++){
			s+=height*Math.pow(0.5, i);
		}
		System.out.println("它在第"+n+"次落地时,共经过多少米?"+s);
		System.out.println("第10次反弹多高?"+height*Math.pow(0.5, 8));
		
	}
	//题目:企业发放的奖金根据利润提成。利润(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,求应发放奖金总数?
	private static void pro11(int amount){
		double num=0;
		if(amount<=10){
			num=0.1*amount;
		}
		else if(amount>10&&amount<=20){
			num=1+(amount-10)*0.075;
		}
		else if(amount>20&&amount<=40){
			num=1.75+(amount-20)*0.05;
		}
		else if(amount>40&&amount<=60){
			num=2.75+(amount-40)*0.03;
		}
		else if(amount>60&&amount<=100){
			num=3.35+(amount-60)*0.015;
		}
		else{
			num=3.95+(amount-100)*0.01;
		}
		System.out.println("当利润为"+amount+"时,发放奖金数为:"+num);
	}
	//输入某年某月某日,判断这一天是这一年的第几天?
	private static void pro12(String s){
		List list=new ArrayList();
		String[] a=s.split("-");
		int days=0;
		for(int i=0;i<a.length;i++){
			list.add(Integer.parseInt(a[i]));
		}
		int month=(int)list.get(1);
		int day=(int)list.get(2);
		int isRun=0;
		if(checkIsRunYear((int)list.get(0))){
			isRun=1;
		}
			switch (month) {
			case 1:
				days=day;
				break;
			case 2:
				days=31+day;
				break;
			case 3:
				days=59+day+isRun;
				break;
			case 4:
				days=90+day+isRun;
				break;
			case 5:
				days=120+day+isRun;
				break;
			case 6:
				days=151+day+isRun;
				break;
			case 7:
				days=181+day+isRun;
				break;
			case 8:
				days=212+day+isRun;
				break;
			case 9:
				days=243+day+isRun;
				break;
			case 10:
				days=273+day+isRun;
				break;
			case 11:
				days=304+day+isRun;
				break;
			case 12:
				days=334+day+isRun;
				break;
			default:
				break;
			}
			System.out.println("这是一年的第"+days+"天");
	}
	//输入三个整数x,y,z,请把这三个数由小到大输出。
	private static void pro13(int a,int b,int c){
		int temp;
		if(a>b){
			temp=a;a=b;b=temp;
			if(b>c){
				temp=b;b=c;c=temp;
			}
			}
		System.out.println(a+"<"+b+"<"+c);
	}




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值