有更优解法的题

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);
	}
}

猜你喜欢

转载自blog.csdn.net/Wgijja/article/details/111824310
今日推荐