dlnb526 发表于 2020-3-22 11:04:20

【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:}

永远的渣滓 发表于 2020-3-22 18:51:09

{:10_277:}

wuhao4221961 发表于 2020-3-23 09:08:18

慢慢来最快

放屁蹦出屎 发表于 2020-3-23 09:16:16

这个习题不错

璀璨·狸 发表于 2020-4-1 08:39:17

谢谢楼主

璀璨·狸 发表于 2020-4-1 08:46:38

观摩大佬

bailean 发表于 2020-4-1 11:25:10

学到啦

majian890324 发表于 2020-4-30 20:42:26

不错不错,支持一下~~~

情缘丶夜未央 发表于 2020-7-22 12:17:55

{:5_102:}

YIDASun 发表于 2020-7-23 16:40:48

我写一个第一题的答案,随机生成字符串的答案。
写的不算好,很多地方比较复杂,比如将类型多次转换,判定条件复杂等等,但能作为一个参考。
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:46:00

测试结果,运气好可以有大小写和数字

本帖最后由 YIDASun 于 2020-7-23 16:48 编辑

测试结果,运气好可以有大小写和数字

YIDASun 发表于 2020-7-24 15:36:20

今天补充第二题答案。
首先,将昨天的类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();
        }
}

可以看一下运行结果:

YIDASun 发表于 2020-7-24 16:34:39

害,干脆再写写第三题答案,用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,所以有点慢,小心电脑卡死。
可以看看效果:

YIDASun 发表于 2020-7-24 16:41:22

上面的代码还能写成一个return返回的方法,一个return就能终结所有for循环,可以尝试一下。

递归的就不写了,哈哈哈哈哈哈。

小曲sy 发表于 2020-7-28 14:13:00

{:10_277:}

lsez2014 发表于 2021-5-2 19:11:05

666

875041187 发表于 2022-4-24 15:29:55

谢谢楼主分享
页: [1]
查看完整版本: 【JAVA练习题15】【数字与字符串】字符串STRING详解