Java编程初级练习题31-40


前言

本文的目的旨在通过练习,提高逻辑思维能力,和算法优化能力。


31.杨辉三角

题目:打印出杨辉三角形 ,完美杨辉三角。
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
        System.out.println("请输入要画的层数:");
        int n = in.nextInt();
        for(int i=1;i<=n;i++) {
        	for(int j=n-i;j>=0;j--)
        		System.out.print("  ");
        	for(int k : yanghui(i))
        		System.out.printf("%4d",k);
        	System.out.println();
        }
        in.close();
	}
    public static int[] yanghui(int n) {
    	if(n==1) return new int[] {1};
    	else if(n==2)  return new int[] {1,1};
    	else{
    		int[] a=new int[n];
    		a[0]=1;a[n-1]=1;
    		for(int i=1;i<n-1;i++) {
    			a[i]=yanghui(n-1)[i-1]+yanghui(n-1)[i];
    		}
        	return a;
    	}
    }
}

32.找数组最大最小值

题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。因为要两次交换,书写一个交换函数
import java.util.Arrays;

public class Main {
    public static void swap(int[] a,int i,int j) {//传入数组引用变量能够直接对数组进行修改
    	int temp=0;
    	temp=a[i];
    	a[i]=a[j];
    	a[j]=temp;
    }
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	   int[] a= {2,3,4,6,7,-20,-7,9,-10};
       int max=a[0];
       int min=a[0];
       for(int i=0;i<a.length;i++) {
    	   if(a[i]>max)  max=a[i];//找出最大值
    	   if(a[i]<min)  min=a[i];//找出最小值
       }
       for(int i=0;i<a.length;i++) {
    	   if(a[i]==max) swap(a,i,0);//最大数放首位
    	   if(a[i]==min) swap(a,i,a.length-1);//最小数放末尾
       }
       System.out.print(Arrays.toString(a));
	}
}

33.两数之和

题目:给出一个整数数组,请在数组中找出两个加起来等于目标值的数, 你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index2.。注意:下标是从1开始的 假设给出的数组中只存在唯一解 例如: 给出的数组为 {20, 70, 110, 150},目标值为90 输出 index1=1, index2=2

方法一:for循环

public class Main {
    public static int[] twoSum (int[] a, int b) {
        for(int i=0;i<a.length-1;i++)
        	for(int j=i+1;j<a.length;j++)
        		if(a[j]==b-a[i]) {
        			return new int[] {i+1,j+1};
        		}
        throw new RuntimeException("不存在");
    }
    public static void main(String[] args) {
    	int[] number= {3,2,7};
    	int[] b= twoSum(number,6);
    	System.out.print(Arrays.toString(b));	
    }
}

方法二:映射、哈希表

原理:将数组中数依次放入哈希表,判断目标值与现有值之差是否在哈希表中,本质思维一致,算法上由于HashMap底层数据结构是数组+链表+红黑树组成,查找是使用红黑树结构更快捷。由于Map方法中键值唯一,value不唯一,只有根据键值取数,没有办法根据数取键值,因此要将数组元素作为键值,数组下表作为值。

import java.util.*;

public class Solution {
    public static int[] twoSum (int[] nums,int target) {
    	Map<Integer, Integer> m = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            if (m.get(target - nums[i])!=null) {//如果能在哈希表中找到目标值与num[i]的差,循环停止
                return new int[]{m.get(target - nums[i]), i+1};
            }
            m.put(nums[i], i+1);
        }
        throw new RuntimeException("不存在");
    }
    public static void main(String[] args) {
    	int[] number= {3,2,4,6,7,5};
    	int[] b= twoSum(number,11);
    	System.out.print(Arrays.toString(b));	//toString方法先把b中元素变成String型,然后打包成数组	
    }
}

34、调换数字位置

题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    }
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	   Scanner in = new Scanner(System.in);
	   int[] a= {2,3,4,6,7,-20,-7,9,-10};
	   System.out.println(Arrays.toString(a));
	   System.out.println("请输入需要调整的数位:");
	   int m =in.nextInt();
	   int[] c=new int[m];
	   for(int i=0;i<m;i++)//取出后m个数
		   c[i]=a[a.length-m+i];
	   for(int i=a.length-m-1;i>=0;i--)//a中元素后移m位,从最后一个开始
		   a[i+m]=a[i];
	   for(int i=0;i<m;i++)//将取出的数重新放回
		   a[i]=c[i];
	   System.out.print(Arrays.toString(a));
       in.close();
	}
}

35、闭环报数

题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位,约瑟夫闭环问题

import java.util.Scanner;

/**
 * @param total 代表参与总人数
 * @param num  表示报数最大值
 */

public class Yuesefu {
	public static void yuesefu(int total,int num) {
		int[] a=new int[total];
		int count=0;//计数
		//初始化数组
		for(int i=0;i<a.length;i++)
			a[i]=i+1;
		//
        for(int i=0;i<a.length;i++) {
        	if(a[i]!=0)
        		count++;
        	if(count%3==0 && a[i]!=0) {
        		System.out.printf("第%d号选手出局\n", a[i]);
        		a[i]=0;
        		total--;
        	}
        	if(i==a.length-1)//数组到头了,重新循环
        		i=-1;
        	if(total==1)
        		break;
        }
        for(int k: a) {
        	if(k!=0)
        		System.out.print("最后剩下的人是:"+k+"号");
	}
}
    public static void main(String[] args) {
    	Scanner  in = new Scanner(System.in);
    	System.out.println("请输入参与人数:");
    	int total=in.nextInt();
    	System.out.println("报数大小:");
    	int num=in.nextInt();
    	yuesefu(total,num);
        in.close();
        }
}

36、字符串长度

题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。

import java.util.Scanner;
public class Main {

	public static void main(String[] args) {
        System.out.println("请输入一个字符串:");
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        int length=stringLength(s);
        System.out.print(length);
        in.close();
    }
    private static int stringLength(String s) {//
        String[] a = s.split("");
        return a.length;
    }
}

37、分奇偶求和函数

题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+…+1/n,当输入n为奇数时,调用函数1/1+1/3+…+1/n

import java.util.Scanner;
public class Main {

	public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        System.out.println("请输入一个正整数:");
        int n = in.nextInt();
        System.out.printf("和为%.4f",sum(n));
        in.close();
        
    }
	public static double sum(int n) {
		double result=0;
		if(n==0) result=0;
		else if(n%2==0) {
			for(int i=2;i<=n;i+=2)
				result+=1.0/i;
		}
		else {
			for(int i=1;i<=n;i+=2)
				result+=1.0/i;
		}
		return result;
	}

38、字典序

题目:字符串排序。 分析:字符串的比较可以用字符串的compareTo函数,通过冒泡排序法排序
public class Main {

	public static void main(String[] args) {
		String[] s = new String[]{"asd","bbb","dddd","add","eddd","ccdd","caaa","adds","cvf","dass"};
		sort(s);
		for(String k : s)
			System.out.print(" "+k);
        
    }
	public static void sort(String[] s) {
		for(int i=0;i<s.length-1;i++) {
			for(int j=i+1;j<s.length;j++)
				if(s[i].compareTo(s[j])>0) {
					String temp="";
					temp=s[i];
					s[i]=s[j];
					s[j]=temp;
				}
		}		
	}
}

39、猴子分桃

题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?

分析:找一个数是5n+1形式,且能经过至少5个人这么分

public class Main {

	public static void main(String[] args) {
	    double i=1;  
		while(!sum(i)) {
			i=i+5;
		}
		System.out.print("最小数为"+i);
    }
	public static boolean sum(double n) {
		int count=0;
		while(n%5==1) {
			count++;
			n=(n-1.0)*0.8;
		}
		if(count>=5) 
			return true;
		else
			return false;
	}	
}

40、反转链表

题目:输入一个链表,反转链表后,输出新链表的表头。
分析:构建一个新链表,从末尾依次加数,每次新加的数作为头结点。

public ListNode ReverseList(ListNode head) {
		if(head.next==null) {//判断链表是否为空
			return head;
		}
		else {
			ListNode newhead=null;//新建一个头结点
			ListNode temp=null;//临时变量
			while(head!=null) {//从原链表取数放入新链表
				temp=head.next;//保存下一个访问节点
				head.next=newhead;//跟在head后面,可以使得新加入的值为头结点
				newhead=head;//取出当前值
				head=temp;//指针后移
			}
		return newhead;
		}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值