有更优解法的题

博客围绕Java编程展开,涵盖比较三个数最大值、按条件求Y值、求四叶玫瑰数等多个问题。针对各问题指出存在的不足,如运算冗余、未统计个数等,并给出优化思路,包括利用循环、取余等方法简化代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.比较三个数中的最大数
		int o = 5;
		int p = 6;
		int q = 7;
		System.out.println( o > p && o > q);//false
		System.out.println( p > o && p > q);//false
		System.out.println( q > p && q > o);//true
		System.out.println(q);
		System.out.println("----------------------------------------");
		int u = (o > p ? o : p);//p
		int v = (p > q ? p : q);//q
		int w = (p > q ? p : q);//q
		System.out.println(u > w ? u : w);
问题:O与P想比较之后的值就是U,无需再进行多余比较。
优化:
		int u = (o > p ? o : p);//p
		System.out.println(u > q ? u : q);		

——————————————————————————————————————————————————————

2.按条件求Y的值
import java.util.Scanner;
class hh {
	public static void main(String [] args) {
		Scanner a = new Scanner(System.in);
		int x = a.nextInt();
		int y;
		if(x >= 3) {
			y = 2*x + 1;
				System.out.println("结果是"+y);
		}else if (x > -1){
			y = 2 * x;
				System.out.println("结果是"+y);
		}else {
			y = 2 * x - 1;
				System.out.println("结果是"+y);
		}
	}
}
问题:运算结果只需要在结尾输出一次,无需多次输出。
优化:
import java.util.Scanner;
class hh {
	public static void main(String [] args) {
		Scanner a = new Scanner(System.in);
		int x = a.nextInt();
		int y;
		if(x >= 3) {
			y = 2*x + 1;
		}else if (x > -1){
			y = 2 * x;
		}else {
			y = 2 * x - 1;
		}	
         System.out.println("结果是"+y);
	}
}
3.求四叶玫瑰树,并统计个数
public class Day06Test {
	public static void main(String [] args) {
	for (int i = 1000; i < 10000; i++) {
			int j = (i/1000)*(i/1000)*(i/1000)*(i/1000);
			int k = ((i/100)%10)*((i/100)%10)*((i/100)%10)*((i/100)%10);
			int l = ((i/10)%10)*((i/10)%10)*((i/10)%10)*((i/10)%10);
			int m = (i%10)*(i%10)*(i%10)*(i%10);
			int n = j+k+l+m;
			if( i== n){
				System.out.println("这是一个四叶玫瑰树:"+n);
				}
			}
		}
	}
问题:求4次平方太过繁琐,且未统计出个数!
优化:可根据FOR循环嵌套求出4次平方值,其中的ABCD是在变化的;在for循环外面定义一个数,辅助计算个数。
class SI {
	public static void main(String[] args) {
		int count = 0;
		for(int a = 1000; a < 10000; a++) {
			int ge = a % 10;
			int shi = a /10 % 10;
			int bai = a /100 % 10;
			int qian = a/1000;
			int A = 1;
			int B = 1;
			int C = 1;
			int D = 1;
			for(int i = 0;i<4;i++){
				A = A*ge;
				B = B*shi;
				C = C*bai;
				D = D*qian;
			if(A+B+C+D==a){
				System.out.println("这是一个四叶玫瑰数:"+ a);
				count++;
				}
			}System.out.println("四叶玫瑰数的个数为:"+ count);
		}
	}
}

4.给一个不多于5位的正整数,先求它是几位数,再逆序打印出各位数字。
import java.util.Scanner;
public class Test03 {
	public static void main(String [] args) {
		Scanner a = new Scanner(System.in);
		System.out.println("请输入一位不多于5位的正整数");
		int b = a.nextInt();
		if (b/10000 >= 1) {
			System.out.println("这是一个5位数");
			int ge = b % 10;
			int shi = b % 100 / 10;
			int bai = b / 100 % 10;
			int qian = b / 1000 % 10;
			int wan = b /10000;
			System.out.println("各位数字为:"+ge+shi+bai+qian+wan);
		}else if (b/1000 >= 1){
			System.out.println("这是一个4位数");
			int ge = b % 10;
			int shi = b % 100 / 10;
			int bai = b / 100 % 10;
			int qian = b / 1000;
			System.out.println("各位数字为:"+ge+shi+bai+qian);
		}else if (b/100 >= 1){
			System.out.println("这是一个3位数");
			int ge = b % 10;
			int shi = b % 100 / 10;
			int bai = b / 100;
			System.out.println("各位数字为:"+ge+shi+bai);
		}else if (b/10 >= 1){
			System.out.println("这是一个2位数");
			int ge = b % 10;
			int shi = b / 10;
			System.out.println("各位数字为:"+ge+shi);
		}else{
			System.out.println("这是一个1位数");
			System.out.println("各位数字为:"+b);
		}
	}
}
问题:太过冗杂,LOW!
优化:可以利用for循环设置位数,再根据位数来求各个位上的值
值得注意的是:求各个位上的数字,除个位数外,都可以利用它们都能对10求整再对10取余。
import java.util.Scanner;
public class Test03_2 {
	public static void main(String [] args) {
		Scanner a = new Scanner(System.in);
		System.out.println("请输入一位不多于5位的正整数");
		int b = a.nextInt();
		int c = b;
		int d = b;
		for(int e = 1; e <= 5; e++) {
			b = b /10;
			if(b == 0){
				System.out.println("这是一个:"+e+"位数");
				for(int f = e; f > 0; f--) {
					c = d % 10;
					d = d / 10;
					System.out.print(" "+c);
				}
				break;
			}
		}
	}
}
5.求1000以内的完数
要想到,只要是因子,那么取余就为0,要想到对一个数求它的因子就是让0—这个数的所有数都要除一次,利用循环。
public class Test02 {
	public static void main(String [] args) {
		for(int a = 1; a <= 1000; a++) {
			int d = 0;
			for(int b = 1; b < a; b++) {
				if(a%b==0) {
				d+=b;
				}
			}if(a==d){
				System.out.println(a);		
			}
		}
	}
}
6.一天加2.5元,每5天减6元,何时能有100元。
public class Test01 {
	public static void main(String [] args ){
		int a = 0;
		double b = 0.0;
		for(; ; ) {
			a++;
			b += 2.5;
			if(a % 5 == 0){
				b-=6;
			}
			if (b >=100){
				System.out.println(a);
				break;
			}
		}
	}
}

优化:利用while更简便

public class Test01 {
	public static void main(String [] args ){
		int a = 0;
		double b = 0.0;
		while(b <100) {
			a++;
			b += 2.5;
			if(a % 5 == 0){
				b-=6;
			}
		}System.out.println(a);
	}
}
7.给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
public class Test20_24 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个不多于5位的数字");
		int a = sc.nextInt();
		int no = 0;
		int u = 1;
		for(int i = 1; i <=5; i++) {
			if(a/u==0) {
				break;
			}
			u *= 10;
			no++;
		}System.out.println("这是一个"+no+"位数");
		int v = 10;
		for(int x = 1; x <= no; x++) {
			if(a / v != 0) {
				System.out.println(a%v+" ");
				a = a/v;			
			}else {
				System.out.println(a);
			}
		}
	}

}
求几位数时,可以根据它可以除以几次10来判断,逆序打印时可以利用求余来做,要注意每次求余的数字都要变化。
8、有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
public class Test27_30 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个数字");
		int i = sc.nextInt();
		int[] array = {12,20,35,49,55,69};
		int[] array1 = new int[array.length+1];
		boolean x = true;
		for(int a = 0; a <= array.length-1; a++) {
			int z = a;
			if(i > array[a]&& i <9999) {
				array1[a] = array[a];
				z++;
				if(z == 6) {
					array1[z] = i;}
			}else if(i < array[a]) {
				array1[a] = i;
				i =9999;
				x = false;
			}else if(x == false) {
				array1[a] = array[a-1];	
				z++;
				if(z == 6) {
					array1[z] = array[a];
					}
				}		
		}
		for(int c = 0; c <= array1.length-1; c++) {
			System.out.println(array1[c]);
		}
		
	}
}
问题:在两个数组共用一个变量的时候就会显得复杂;
优化:定义两个变量分别代表两个数组的索引;
import java.util.Scanner;
public class Test28_30 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个数字");
		int i = sc.nextInt();
		int[] array = {12,20,35,49,55,69};
		int[] array1 = new int[array.length+1];
		int b = 0;
		for(int a = 0; a <= array.length-1; a++) {
			if(i > array[a]) {
				array1[b] = array[a];
				b++;
				if(b == array.length) {//如果数字为最大的时候
					array1[b] = i;
				}
			}else {
				array1[b] = i;
				i = 9999;
				b++;
				a--;	//当数字为最小的时候, a的下一轮需要减1			
			}
		}
		for(int x = 0; x <= array1.length-1; x++) {
			System.out.println(array1[x]);
		}

	}

}
9、输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组
import java.util.Scanner;
public class Test32_34 {
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);	
		System.out.println("请输入数组元素个数");
		int n = sc.nextInt();
		int[] arr = new int[n];
		for(int a = 0; a <= n-1; a++) {
			System.out.println("请输入"+n+"个数字,现在输入第"+(a+1)+"个。");
			arr[a] = sc.nextInt();
		}System.out.print("输入的数组arr={");
		for(int i = 0; i <= arr.length-1; i++) {
			System.out.print(arr[i]+" ");
		}System.out.println("}");
		//------------------交换大元素-----------------------
		int temp=0;
		for(int i = 1; i <= arr.length-1; i++) {
			if(arr[temp] < arr[i]) {
				temp = i;
			}
		}
		int temp1 = arr[0];
		arr[0] = arr[temp];
		arr[temp] = temp1;
		System.out.print("交换大元素后为:");
		for(int i = 0; i <= arr.length-1; i++) {		
			System.out.print(arr[i]+" ");
		}System.out.println();
		//---------------------交换小元素---------------------
		int temp2 = arr.length-2;
		for(int i = 0; i <= arr.length-1; i++) {
			if(arr[temp2] >= arr[i]) {
				temp2 = i;
			}
		}
		int temp3 = arr[arr.length-1];
		arr[arr.length-1] = arr[temp2];
		arr[temp2] = temp3;
		System.out.print("交换小元素后为:");
		for(int i = 0; i <= arr.length-1; i++) {			
			System.out.print(arr[i]+" ");
		}
	}
}
问题:某些代码重复书写
优化:定义一个方法来解决
import java.util.Scanner;
public class Test32_34 {
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);	
		System.out.println("请输入数组元素个数");
		int n = sc.nextInt();
		int[] arr = new int[n];
		for(int a = 0; a <= n-1; a++) {
			System.out.println("请输入"+n+"个数字,现在输入第"+(a+1)+"个。");
			arr[a] = sc.nextInt();
		}System.out.print("输入的数组arr={");
		bianLi(arr);
		System.out.println("}");
		//------------------交换大元素-----------------------
		int temp=0;
		for(int i = 1; i <= arr.length-1; i++) {
			if(arr[temp] < arr[i]) {
				temp = i;
			}
		}
		int temp1 = arr[0];
		arr[0] = arr[temp];
		arr[temp] = temp1;
		System.out.print("交换大元素后为:");
		bianLi(arr);System.out.println();
		//---------------------交换小元素---------------------
		int temp2 = arr.length-2;
		for(int i = 0; i <= arr.length-1; i++) {
			if(arr[temp2] >= arr[i]) {
				temp2 = i;
			}
		}
		int temp3 = arr[arr.length-1];
		arr[arr.length-1] = arr[temp2];
		arr[temp2] = temp3;
		System.out.print("交换小元素后为:");
		bianLi(arr);
	}
	public static void bianLi(int[] arr) {
		for(int i = 0; i <= arr.length-1; i++) {			
			System.out.print(arr[i]+" ");
		}
	}
}
10、"aaaabbccddd!@#@#$%cc66ff"判断各个字符出现的次数
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class Demo_4 {
	public static void main(String[] args) {
		String s = "aaaabbccddd!@#@#$%cc66ff";
		char[] ca = s.toCharArray();
		Map<Integer, Character> map = new HashMap<Integer, Character>();
		Integer a = 1;
		for (char c : ca) {
			map.put(a++, c);
		}
		Set<Entry<Integer, Character>> es = map.entrySet();
		
		for (Entry<Integer, Character> entry : es) {
			int i = 0;
			for (Entry<Integer, Character> entry2 : es) {
				if(entry.getValue().equals(entry2.getValue())) {
					i++;
				}
			}
			String ss = entry.getValue()+""+i+"个";
			Set<String> sss = new HashSet<String>();
			sss.add(ss);
			System.out.println(sss);
		}
	}
}
问题:繁琐,且结果不是正常的,而且逻辑有问题,应该是把字符作为键,出现次数作为值,这样才好在又出现的时候进行统计工作。
优化:map集合中有特定的判断包含与否的方法containsKey()containsValue();
import java.util.HashMap;
import java.util.Map;
public class Demo_5 {
	public static void main(String[] args) {
		String s = "aaaabbccddd!@#@#$%cc66ff";
		char[] ch = s.toCharArray();
		Map<Character, Integer> map = new HashMap<Character, Integer>();
		for (char c : ch) {
			if(!map.containsKey(c)) {
				map.put(c,1);
			}else {
				map.put(c, map.get(c)+1);
			}
		}System.out.println(map);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值