【JAVA练习题15】【数字与字符串】字符串STRING详解
【JAVA练习题】【索引贴】
https://fishc.com.cn/thread-157183-1-1.html
习题来源:how2j
本贴下答案内容为我和广大鱼油解答以及提示哦!答案仅供参考!如果大神们有更好的做法还请不吝指教。
【JAVA练习题15】【数字与字符串】字符串STRING详解
1.随机字符串
创建一个长度是5的随机字符串,随机字符有可能是数字,大写字母或者小写字母
给点提示: 数字和字符之间可以通过互相转换
char c = 'A';
short s = (short) c;
通过这个手段就能够知道字符 a-z A-Z 0-9 所对应的数字的区间了
需要用到ASCII码对照表
2.字符串数组排序
创建一个长度是8的字符串数组
使用8个长度是5的随机字符串初始化这个数组
对这个数组进行排序,按照每个字符串的首字母排序(无视大小写)
注1: 不能使用Arrays.sort() 要自己写
注2: 无视大小写,即 Axxxx 和 axxxxx 没有先后顺序
3.穷举法破解密码
1. 生成一个长度是3的随机字符串,把这个字符串作为当做密码
2. 使用穷举法生成长度是3个字符串,匹配上述生成的密码
要求: 分别使用多层for循环 和 递归解决上述问题
参考解答:
**** Hidden Message *****
点击加入订阅淘帖:【JAVA练习题】第一季
static/image/hrline/line5.png
评个分呗!{:10_307:} {:10_277:} 慢慢来最快 这个习题不错 谢谢楼主 观摩大佬 学到啦 不错不错,支持一下~~~ {:5_102:} 我写一个第一题的答案,随机生成字符串的答案。
写的不算好,很多地方比较复杂,比如将类型多次转换,判定条件复杂等等,但能作为一个参考。
package first.test.Demo;
public class RandomString {
public static void main(String[] args) throws Exception {
//生成需要判断的数字,对应字符A-Z 0-9
String targetNum[] = new String[] {"48","49","50","51","52","53","54","55","56","57"};
String targetLetter[] = new String[] {"65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90"};
int i = 1;
String temp = "";
while (i <= 5) {
String number = String.valueOf((int) (Math.random()*100));
if (isIn(number, targetNum)) {//如果为数字,转为0-9
int number_int = Integer.valueOf(number);
char c =(char) number_int;
temp += c;
i += 1;
} else if (isIn(number, targetLetter)) {//判断是否为字母
if (((int) (Math.random()*100)) % 2 == 1) {//用随机数判断,如果为奇数则为小写字母
int number_int = Integer.valueOf(number) + 32;
char c =(char) number_int;
temp += c;
i += 1;
} else {
int number_int = Integer.valueOf(number);
char c =(char) number_int;
temp += c;
i += 1;
}
} else {
continue;
}
}
System.out.println(temp);
}
//判断生成数是否在目标数组中
private static boolean isIn(String substring, String[] source) {
for (int i = 0; i < source.length; i++) {
String aSource = source;
if (aSource.equals(substring)) {
return true;
}
}
return false;
}
}
测试结果,运气好可以有大小写和数字
本帖最后由 YIDASun 于 2020-7-23 16:48 编辑测试结果,运气好可以有大小写和数字 今天补充第二题答案。
首先,将昨天的类RandomString稍作修改,方法main()返回目标字符串:
package first.test.Demo;
public class RandomString {
public String main() throws Exception {
//生成需要判断的数字,对应字符A-Z 0-9
String targetNum[] = new String[] {"48","49","50","51","52","53","54","55","56","57"};
String targetLetter[] = new String[] {"65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90"};
int i = 1;
String temp = "";
while (i <= 5) {
String number = String.valueOf((int) (Math.random()*100));
if (isIn(number, targetNum)) {//如果为数字,转为0-9
int number_int = Integer.valueOf(number);
char c =(char) number_int;
temp += c;
i += 1;
} else if (isIn(number, targetLetter)) {//判断是否为字母
if (((int) (Math.random()*100)) % 2 == 1) {//用随机数判断,如果为奇数则为小写字母
int number_int = Integer.valueOf(number) + 32;
char c =(char) number_int;
temp += c;
i += 1;
} else {
int number_int = Integer.valueOf(number);
char c =(char) number_int;
temp += c;
i += 1;
}
} else {
continue;
}
}
return temp;
}
//判断生成数是否在目标数组中
private static boolean isIn(String substring, String[] source) {
for (int i = 0; i < source.length; i++) {
String aSource = source;
if (aSource.equals(substring)) {
return true;
}
}
return false;
}
}
然后创建类StringRank,用RandomString生成目标数组,再用冒泡法排序:
package first.test.Demo;
public class StringRank {
public static void main(String[] args) throws Exception {
String initialArray[] = new String;
System.out.print("初始化数组为:");
for (int i = 0; i < 8; i++) {
initialArray = new RandomString().main();
System.out.print(initialArray);
System.out.print(" ");
}
System.out.println();
//冒泡排序,从小到大
for (int m = (initialArray.length - 1); m > 0; m--) {
for (int n = 0; n < m; n++) {
int tempA = (int) initialArray.charAt(0);
int tempB = (int) initialArray.charAt(0);
//将小写字母的值减去32,就不区分大小写了
if (tempA > 96) {
tempA -= 32;
}
if (tempB > 96) {
tempB -= 32;
}
if (tempA > tempB) {
String temp = initialArray;
initialArray = initialArray;
initialArray = temp ;
}
}
}
System.out.print("排序后的数组为:");
for (int i = 0; i < 8; i++) {
System.out.print(initialArray);
System.out.print(" ");
}
System.out.println();
}
}
可以看一下运行结果:
害,干脆再写写第三题答案,用for循环实现:
package first.test.Demo;
public class ForLoop {
public static void main(String[] args) throws Exception {
String password = new RandomString().main();
System.out.println(password);
String targetList[] = new String[] {"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
String temp = "";
for (int i1 = 0; i1 < targetList.length; i1++) {
for (int i2 = 0; i2 < targetList.length; i2++) {
for (int i3 = 0; i3 < targetList.length; i3++) {
for (int i4 = 0; i4 < targetList.length; i4++) {
for (int i5 = 0; i5 < targetList.length; i5++) {
temp = targetList + targetList + targetList + targetList + targetList;
if (password.equals(temp)) {
System.out.println("i1 = " + i1);
System.out.println("i2 = " + i2);
System.out.println("i3 = " + i3);
System.out.println("i4 = " + i4);
System.out.println("i5 = " + i5);
break;
}
}
if (password.equals(temp)) {
break;
}
}
if (password.equals(temp)) {
break;
}
}
if (password.equals(temp)) {
break;
}
}
if (password.equals(temp)) {
break;
}
}
System.out.println("找到目标密码为:" + temp);
}
}
这里用break终止循环,因为每次只能终止一个for,所以要终止5回。
因为字符串长度我设置为5,所以有点慢,小心电脑卡死。
可以看看效果:
上面的代码还能写成一个return返回的方法,一个return就能终结所有for循环,可以尝试一下。
递归的就不写了,哈哈哈哈哈哈。 {:10_277:} 666 谢谢楼主分享
页:
[1]