程序题练习---初级篇

方法肯定不是最优的,还希望能和大家交流探讨

一、初级篇

1.输入n,求1到n的和

public static int sumToN(int n){
		
		return (n==1)?1:(n+sumToN(n-1));
		
	}
	public static void main(String[] args) {
		System.out.println("请输入一位正整数:");
		Scanner scan = new Scanner(System.in);
		int i = scan.nextInt();
		System.out.println("1到"+i+"的和为:"+sumToN(i));
	}

2.输入n,求n以内3或者5的倍数的和

public static int sum3Or5Mul(int n){
		if(n>2){
		   return (n%3==0||n%5==0)?(n+sum3Or5Mul(n-1)):sum3Or5Mul(n-1);
		}else{
			return 0;
		}		
	}
	
	public static void main(String[] args) {
		System.out.println("请输入一位整数:");
		Scanner scan = new Scanner(System.in);
		int i = scan.nextInt();
		System.out.println("1到"+i+"之间3或者5的倍数的和"+sum3Or5Mul(i));
	}

3.输入整数n,按40%概率输出1到n的和按60%的概率输出1到n的乘积

public static int productToN(int n){
		return n==1?1:n*productToN(n-1);
	}
public static int sumToN(int n){
		
		return (n==1)?1:(n+sumToN(n-1));
		
	}
public static void main(String[] args) {
		System.out.println("请输入一位整数:");
		Scanner scan = new Scanner(System.in);
		int i = scan.nextInt();
		Random rm = new Random();
		int index = rm.nextInt(10);
		if(index<4){
			System.out.println("1到"+i+"之间的和为:"+sumToN(i));
		}else{
			System.out.println("1到"+i+"之间的积为:"+productToN(i));
		}	
	}

4.输入整数n,打印n*n的乘法口诀表(格式对齐)

//求整数的位数
	public  static int getNOfInt(int n){
		return Integer.toString(n).length();
	}
	
public static void main(String[] args) {
		System.out.println("请输入一位整数:");
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		System.out.println(n+"*"+n+"的乘法表为:");
		for(int i= 1;i <= n;i++){
			for(int j = 1;j <= i;j++){
				int a = getNOfInt(n);
				int b = getNOfInt(n*n);
			 String fomat = "%1$"+a+"d"+"*"+"%2$"+a+"d"+"="+"%3$"+b+"d";
				String res = String.format(fomat, i,j,i*j);
				System.out.print(res+" ");
			}
			System.out.println();
		}
	}

5.游戏:程序随机生成0-99内的一个数字,由用户猜测,并提示用户输入是大是小,如果猜对输出总的猜测次数

//获取输入的数字
	public static int getInputNum(){
		Scanner scan = new Scanner(System.in);
		int i = scan.nextInt();
		if(i<0||i>99){
			throw new IllegalArgumentException ("输入错误,输入数据不是0-99整数!");
		}else{
			return i;
		}
	}
//进行判断输入数字和所猜测数字的大小,Num是所猜测的数字,n是输入的数字,m是已经猜了的次数
	public static void printRes(int Num,int n,int m){
		if(n != Num){
			String res= n>Num?"您输入的数字大了":"您输入的数字小了";
			System.out.println(res);
			printRes(Num,getInputNum(),m+1);
		}else{
			System.out.println("您猜对了,共用了"+(m+1)+"次!");
		}
	}
	
public static void main(String[] args) {
		System.out.println("猜数字游戏:请猜测出0-99的一个整数:");
		Random rm = new Random();
		int num = rm.nextInt(100);
		printRes(num, getInputNum(),0);
	}

6.输出接下来的20个闰年

//判断是闰年
	public static boolean isLeapYear(int year){
		return (year%4==0 && year%100!=0)||(year%400==0);
	}
//打印最近的20个闰年
	public static void printLeapYears(int m){
		int i = 0;
		while(i<20){
			if(isLeapYear(m)){
				System.out.print(m+" ");
				i++;
			}
			m++;
		}
	}
	public static void main(String[] args) {
		System.out.println("最近的20个闰年分别为:");
		printLeapYears(2013);
	}

7.找出正整数n以内的全部素数

//寻找max以内的素数并输出
	public static void findPrime(int max){
		System.out.println(max+"以内的素数为:");
		int i=0; //用于计数
		if(max<1){
			throw new IllegalArgumentException("无");
		}else{
			System.out.print(String.format("%5d", 2));
			i++;
			for(int j=3;j<=max;j=j+2){
				boolean flag = true;
				for(int k=3;k<=(int)Math.sqrt(j);k=k+2){
					if(j%k==0){
						flag=false;
					}
				}
				if(flag){
					System.out.print(String.format("%5d", j));
					i++;
					if(i%10==0){
						System.out.println();
					}
				}
			}	
		}
		System.out.println();
		System.out.println("共有:"+i+"个素数");
	}
	
	
public static void main(String[] args) {
		 double start = System.currentTimeMillis();
		 findPrime(10000);
		 double end = System.currentTimeMillis();
		 System.out.println("所用时间:"+(end-start)+"毫秒");

	}

8. 写一个函数,返数组中最大的数。

//生成具有n个m以内随机整数的数组
	public static int[] creatArray(int n,int m){
		Random rm  = new Random();
		int[] array = new int[n];
		for(int i=0;i<n;i++){
			array[i]=rm.nextInt(m);
		}
		return array;
	}
	
//获取数组中的最大元素
	public static int getMaxNum(int[] array){
		int max = array[0];
		for(int i=0;i<array.length;i++){
			max = max>array[i]?max:array[i];
		}
		return max;
	}
	
public static void main(String[] args) {
		 int[] array  = creatArray(20,100);
		 System.out.println("原数组为:");
		 for(int i=0;i<array.length;i++){
			 System.out.print(array[i]+" "); 
		 }
		 System.out.println();
		 System.out.println("最大数为:"+getMaxNum(array));
	}

原数组为:
25 54 69 54 40 3 39 85 62 91 5 90 86 71 65 63 17 65 35 75 
最大数为:91

9. 交替合并两个数组

// 写个函数交替合并两个数组
	public static char[] join(char a[],char b[]){
		int length = (a.length<b.length)?2*a.length:2*b.length; 
		char [] array = new char[a.length+b.length];
		for(int i = 0;i<length/2;i++){
			array[2*i]= a[i];
			array[2*i+1] = b[i];
		}
		for(int j = length;j<(a.length+b.length);j++){
			array[j] = (a.length<b.length)?b[j-a.length]:a[j-b.length];
		}
		return array;
	}
//输出数组
	public static void printArray(char[] array){
		for(int i=0;i<array.length;i++){
			System.out.print(array[i]+" ");
		}
		System.out.println();
	}
	public static void main(String[] args) {
		char[] a  = {'1','2','3'};
		char[] b  = {'a','b','c','d','e'};
		System.out.println("原数组为:");
		printArray(a);
		printArray(b);
		System.out.println("交替合并两个数组后:");
		printArray(join(a,b));
	}
原数组为:
1 2 3 
a b c d e 
交替合并两个数组后:
1 a 2 b 3 c d e

10. 给定一个字符串数组并按下面表示打印出来,一行一个打印在矩形框中

如["Hello","World", "in", "a", "frame"] 打印的结果是:

*********

* Hello *

* World *

* in        *

* a         *

* frame *

*********

//获取字符串数组最长元素的长度
	public static int getMaxLength(String[] strArray){
		int length = strArray[0].length();
		for(int i = 0;i<strArray.length;i++){
			length= strArray[i].length()>length?strArray[i].length():length;
		}
		return length;
	}
	//输出一行n个星号
	public static void printNstar(int n){
		for(int i=0;i<n;i++){
			System.out.print("*");
		}
		System.out.println();
	}
	//按格式输出字符串数组
	public static void printStrArray(String[] strArray){
		int maxLength = getMaxLength(strArray);
		printNstar(maxLength+2);
		for(int i = 0;i<strArray.length;i++){
		System.out.println("*"+String.format("%-"+maxLength+"s"+"*", strArray[i]));
		}
		printNstar(maxLength+2);
	} 
	
	public static void main(String[] args) {
		String[] strArray = {"Hello","world","in","a","frame"};
		printStrArray(strArray);
	}

11. 写个函数,返回指定数的各位数字的列表。

//给一个整数,返回各位数字的数组
	public static int[] getNumArray(int n){
		int[] array = new int[getNOfInt(n)]; //getNOfInt参见初级篇第4题
		int i = 0;
		int temp = n;
		while(temp!=0){
			array[i++]=temp%10;
			temp = temp/10;
		}
		return array;
	}
	public static void main(String[] args) {
		int[] array = getNumArray(1258976);
		for(int i=array.length-1;i>=0;i--){
			System.out.print(array[i]+" ");
		}
	}

12. 实现下面的排序算法:选择排序,插入排序,归并排序,快速排序,冒泡排序

选择排序

//选择排序
	public static int[] selectSort(int[] array){
		for(int i=0;i<array.length-1;i++){
			for(int j=i+1;j<array.length;j++){
				if(array[i]>array[j]){
					int temp = array[i];
					array[i] = array[j];
					array[j] =temp;
				}
			}
		}
		return array;
	}
	public static void main(String[] args) {
		int[] array = creatArray(100000,10000);//参见第初级8题
		double start = System.currentTimeMillis();
		selectSort(array);
		double end  = System.currentTimeMillis();
		System.out.println("所用时间为:"+(end-start)+"毫秒!");
	}
所用时间为:14015.0毫秒!

插入排序

//插入排序
	public static int[] insertSort(int[] array){
		int length = array.length;
		for(int i=1;i<length;i++){ //从第二个元素起依次将元素插入前面已经排好序的部分数组中
			int temp = array[i];
			int j;
			for(j=i;j>0&&temp<array[j-1];j--){//如果比前一个数小
				array[j]=array[j-1]; //前一个数往后移
			}
			array[j]=temp; //将此数放在前一个数的位子上
		}
		return array;
	}
	
	public static void main(String[] args) {
		int[] array = creatArray(100000,10000);//参见第初级8题
		double start = System.currentTimeMillis();
		insertSort(array);
		double end  = System.currentTimeMillis();
		System.out.println("所用时间为:"+(end-start)+"毫秒!");
	}
所用时间为:5157.0毫秒!

归并排序

//归并排序:速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列
public static int[] mergeTwoArray(int[] leftArray ,int[] rightArray){
		int[] newArray = new int[leftArray.length+rightArray.length];
		int index=0,i,j;
		for(i=0,j=0;i<leftArray.length&&j<rightArray.length;index++){
			 if(leftArray[i]<rightArray[j]){
				 newArray[index] = leftArray[i++];
			 }else{
				 newArray[index] = rightArray[j++];
			 }
		}
		for(;i<leftArray.length;i++){
			newArray[index++]=leftArray[i];
		}
		for(;j<rightArray.length;j++){
			newArray[index++]=rightArray[j];
		}
		return newArray;
	}
	
	public static int[] mergeSort(int[] array){
		if(array.length==1){
			return array;
		}else{
			int[] leftArray = new int[array.length/2];
			int[] rightArray = new int[array.length-array.length/2];
			int center = array.length/2;
			for(int i=0;i<leftArray.length;i++){
				leftArray[i]=array[i];
			}
			for(int j=0,k=center;j<rightArray.length;j++,k++){
				rightArray[j]= array[k];
			}
			int[] sortedLeftArray = mergeSort(leftArray);
			int[] sortedrightArray = mergeSort(rightArray);
			return mergeTwoArray(sortedLeftArray,sortedrightArray);
		}
	}
	
	public static void main(String[] args) {
		int[] array = creatArray(100000,10000);//参见第初级8题
		double start = System.currentTimeMillis();
		mergeSort(array);
		double end  = System.currentTimeMillis();
		System.out.println("所用时间为:"+(end-start)+"毫秒!");
	}
所用时间为:31.0毫秒!

快速排序

//以数组最后一个元素作为主元将数组进行划分,使得数组的左边元素都比主元小,右边的都比主元大
	public static int partition(int[] array,int start,int end){
		int key = array[end];
		int i = start; //主要是用于依次存放比主元小的元素
		int j = start; //用于遍历数组寻找比主元小的元素
		for(;j<end;j++){ //将小于key的往前放
			if(array[j]<key){
				int temp = array[i];
				array[i] = array[j];
				array[j] = temp;
				i++;
			}
		}
		int flag = array[i];//将key放到划分位置
		array[i] = key;
		array[end] = flag;
		return i; //返回划分的位置
	}
	//快速排序
	public static int[] quickSort(int[] array,int start,int end){
		if(start>=end){
			return array;
		}else{
			int index  = partition(array,start,end);
			quickSort(array,start,index-1);
			quickSort(array,index+1,end);
			return array;
		}
	}
	public static void main(String[] args) {
		int[] array = creatArray(100000,10000);//参见第初级8题
		double start = System.currentTimeMillis();
		quickSort(array,0,array.length-1);
		double end  = System.currentTimeMillis();
		System.out.println("所用时间为:"+(end-start)+"毫秒!");
	}
所用时间为:15.0毫秒!

冒泡排序

//冒泡排序
	public static int[] bubbleSort(int [] array){
		//每次排序将一个数字可以按序对位,所以要经过array.length-1次排序
		for(int i=0;i<array.length-1;i++){
			for(int j=array.length-1;j>i;j--){ //从后往前查,小于前面的数就交换,保证小的数往前放
				if(array[j]<array[j-1]){
					int temp = array[j-1];
					 array[j-1] = array[j];
					 array[j] =temp;
				}
			}
		}
		return array;
	}
	public static void main(String[] args) {
		int[] array = creatArray(100000,10000);//参见第初级8题
		double start = System.currentTimeMillis();
		bubbleSort(array);
		double end  = System.currentTimeMillis();
		System.out.println("所用时间为:"+(end-start)+"毫秒!");
	}
所用时间为:21078.0毫秒!






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
最常见的Java面试大全的程序面试程序,很有影响力的哦!好好珍惜这个资料吧!有Java的常见面试的冒泡,常见的算法,继承,多态 1.抽象: 抽象就是忽略一个与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问,而只是选择其的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承:  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装:  封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性:  多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值