子兮子兮 子兮子兮

No can, but will.

目录
猿圈网的几个Java挑战题评测题分享
/        

猿圈网的几个Java挑战题评测题分享

先不管猿圈网是干什么的,反正我觉得那是一个可以做题,可以敲代码的网站 😆 ,昨天意外发现了这个网站,在上面做了几道 Java 的题,总感觉哪里做的不太对劲,分享出来相互交流一下,帮忙看看我做的到底哪块是不对的。

相关说明:

代码中从注释 //No.1 开始到注释 //end_code 结束是需要自己写代码实现功能的地方,除此部分之外的代码基本都是试题给定的代码。

1. 插入排序

用 java 代码实现插入排序

 1import java.util.Arrays; // 自己导入
 2
 3public class InsertSortTest {
 4
 5	public static void main(String[] args) {
 6		int[] array = { 49, 38, 65, 97, 76, 13, 27, 14, 10 };
 7		//No.1
 8		//开始写代码,用java实现插入排序
 9		if (array == null || array.length == 0) {	//判断数组不存在或为空
10			return;
11		}
12		 
13		int i, j, tmp;
14		int len = array.length;
15		for (i = 1; i < len; i++) { // 从 1 开始遍历 array
16			j = i;
17			tmp = array[i];
18			while (j > 0 && tmp < array[j - 1]) { // 如果 array[i] < array[i - 1]
19				array[j] = array[j - 1]; // array[i] = array[i - 1]
20				j--;
21			}
22			array[j] = tmp; // array[i - 1] = array[i]
23		}
24		System.out.println(Arrays.toString(array));
25		//end_code
26	}
27}
  1
  2### 2. ip 转化为整数
  3> #### `使用 java 代码实现将 IPV4 的 IP 地址转化为对应整数并输出,比如 192.168.199.1 对应整数为 3232286465`
  4> 
  5> ``` java
  6> public class IpToNumber {
  7> 	public static void main(String[] args) {
  8> 		IpToNumber ipToNumber = new IpToNumber();
  9> 		System.out.println("IPV4的IP地址对应的整数为 : " + ipToNumber.ipToLong("192.168.199.1"));
 10> 	}
 11> 
 12> 	public long ipToLong(String ipAddress) {
 13> 		long result = 0;
 14> 		String[] ipAddressInArray;
 15> 		
 16> 		//No.1
 17> 		//开始写代码,将IPV4的IP地址转化为相对应的整数
 18> 		ipAddressInArray = ipAddress.split("\\."); // 将 ip 截为 4 个部分字符串
 19> 		long[] ipLong = new long[4];
 20> 		for (int i = 0; i < ipAddressInArray.length; i++) {
 21> 			ipLong[i] = Long.parseLong(ipAddressInArray[i]); // 分别转为 long 型后存入 ipLong 中
 22> 		}
 23> 		result = (ipLong[0] << 24) + (ipLong[1] << 16) + (ipLong[2] << 8) + ipLong[3]; // 进行位移操作
 24> 		//end_code
 25> 		return result;
 26> 	}
 27> }
 28> ```
 29
 30### 3. 找重复数字和未出现数字
 31> #### `假设 0-10000 数字中有 2 个数字相同,还有 1 个数字没有出现,仅遍历一次数组找出重复数和未出现的数字。`
 32> 
 33> ``` java
 34> public class FindNumberTest {
 35> 	public static void main(String[] args) {
 36> 		int number[] = new int[10001];
 37> 		int numCopy[] = new int[10001]; // 这个变量我没有用到...不知道是用来干嘛的
 38> 		int repeat = 0, notAppear = 0;
 39> 		int sumNumber = 0;
 40> 		int i;
 41> 
 42> 		for (i = 0; i < 10001; i++) {//数组初始化
 43> 			number[i] = i;
 44> 		}
 45> 		number[573] = 5236;//设定重复数字5236出现两次,573不出现
 46> 
 47> 		//No.1
 48> 		//开始写代码,仅遍历一次数组找出重复数和未出现的数字。 
 49> 		for (int j = 0; j < number.length; j++) {
 50> 			if(j != number[j] && number[j] == number[sumNumber]) {  // 因为数组 number[0] = 0, number[1] = 1... 所以这算不算是投机取巧 😂 
 51> 			  repeat = number[j];
 52> 			  notAppear = j;
 53> 			}
 54> 			sumNumber++;
 55> 		}		
 56> 		//end_code
 57> 		System.out.println("重复数字:"+repeat + " 未出现数字:" + notAppear);
 58> 	}
 59> }
 60> ```
 61
 62### 4. 约瑟夫环问题
 63> #### `用 java 代码实现约瑟夫环问题,50 个人围成一圈报数,报到 3 的倍数的离开,求最后剩下的那个人原来站的位置`
 64> ``` java
 65> // 在主方法中调用
 66> public static void YueSeFuLoop() { 
 67> 	LinkedList linkedlist = new LinkedList();
 68> 	//No.1
 69> 	//开始写代码,有50人围成一圈报数,报到3的倍数的人离开,求最后剩下的人原来站在第几位,实现removeFromList方法
 70> 	for (int i = 1; i <= 50; i++) {  
 71> 		linkedlist.add(i);  
 72> 	}  
 73> 	int index = 0;
 74> 	while(linkedlist.size() > 0) { // 最后一个人离开之前
 75> 		for (int i = 0; i < (3 - 1); i++) { // 如果不是 3 的倍数
 76> 			int num = linkedlist.remove(0); // 移除不是 3 的倍数的数,第一次开始为 1
 77> 			linkedlist.add(num); // 将不是 3 的倍数的数放在最后,第一次开始是把 1 放在 50 之后
 78> 		}
 79> 		// 未进入 for 循环,说明是 3 的倍数,则从列表中移除
 80> 		index = linkedlist.remove(0); 
 81> 		System.out.println("end : " + linkedlist.size() + " \t index: " + index);
 82> 	}
 83> 	// while 循环执行完毕,最后一个人已被移除
 84> 	System.out.println(index); // 最后一个人开始所站的位置 11
 85> }
 86> ```
 87
 88### 5. 阿姆斯特朗数问题
 89> #### `例如 153=1^3+5^3+3^3 的数叫做 Armstrong 数,用 java 代码实现输出三位数的 Armstrong 数`
 90> ``` java
 91// 同样还是在主方法里调用 😁 
 92> public static void armstrongTest() {
 93> 	int hundredsDigit,tensDigit,unitsDigit;//hundredsDigit表示数字的百位,tensDigit表示数字的十位,unitsDigit表示数字的个位
 94> 	System.out.println("寻找Armstrong数:");
 95> 	for (int i = 100; i <= 999; i++) {
 96> 		//No.1
 97> 		//开始写代码,例如153可以满足1^3 + 5^3 + 3^3 = 153,这样的数称为Armstrong数,输出所有三位数中的Armstrong数
 98> 		hundredsDigit = i / 100; // 获取百位数
 99> 		tensDigit = (i % 100) / 10; // 十位数
100> 		unitsDigit = i % 10; // 个位数
101> 		// Math.pow(double a, double b) 返回 a 的 b 次方
102> 		if ((Math.pow(hundredsDigit, 3) + Math.pow(tensDigit, 3) + Math.pow(unitsDigit, 3)) == i) // 如果是Armstrong数则输出
103> 			System.out.print(i + " ");
104> 		//end_code
105> 	}
106> 	System.out.println();
107> }
108> ```
109
110### 6. 统计指定类型字符个数
111> #### `用 java 代码实现输入一串字符串,统计其中的数字、英文、空格、其他字符个数`
112> ``` java
113public static void strLength() {
114	int digital = 0;//数字个数
115	int  character = 0;//英文个数
116	int other = 0;//其他字符个数
117	int blank = 0;//空格个数
118	char[] chars = null;
119	System.out.println("这是任意一串字符:");
120	String string = "djfiepqo ioghr4 8758495 7123hr37hfjW$@@$@^%!";
121	chars = string.toCharArray();
122	//No.1
123	//开始写代码,计算任意一串字符中的数字个数、英文字母个数、空格个数和其他字符个数
124	for (int i = 0; i < chars.length; i++) {
125		if(chars[i] >= '0' && chars[i] <= '9') { // 数字
126			digital++;
127		} else if((chars[i] >= 'a' && chars[i] <='z') || (chars[i] >= 'A' && chars[i] <='Z')) { // 英文字母
128			character++;
129		} else if(chars[i] == ' ') { // 空格
130			blank++;
131		} else { // 其他字符
132			other++;
133		}
134	}
135	//end_code
136	System.out.println("数字个数: " + digital);
137	System.out.println("英文字母个数: " + character);
138	System.out.println("空格个数: " + blank);
139	System.out.println("其他字符个数:" + other);
140}
141> ```
142
143### 7. 用递归方法计算一个数的阶乘
144> #### `给定一个正整数,Java 实现用递归的方法计算它的阶乘`
145> ``` java
146> public class Test {
147> 	public static void main(String[] args) {
148> 		int number = 12;
149> 		Recursion factorialRecursion = new Recursion();
150> 		System.out.println(number + "! = " + factorialRecursion.recursion(number));
151> 	}
152> }
153> //No.1
154> //开始写代码,给定一个正整数,用递归的方法计算它的阶乘.main函数已给出,实现Recursion类
155> class Recursion {
156> 	public int recursion(int number) {
157> 		if(number < 0) {
158> 			System.out.println("请输入0或正整数!");
159> 			return 0;
160> 		} else if(number == 1 || number == 0) {
161> 			return 1;
162> 		} else {
163> 			return number * recursion(number - 1);
164> 		}
165> 	}
166> }
167> //end_code
168> ```
169> 
170> 艾玛呀,一不小心又到凌晨了....