鱼C论坛

 找回密码
 立即注册
查看: 4301|回复: 16

[系列教程] 【JAVA练习题15】【数字与字符串】字符串STRING详解

[复制链接]
发表于 2020-3-22 11:04:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

【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循环 和 递归解决上述问题




参考解答:
游客,如果您要查看本帖隐藏内容请回复





                               
登录/注册后可看大图



评个分呗!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-22 18:51:09 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-23 09:08:18 | 显示全部楼层
慢慢来最快
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-23 09:16:16 | 显示全部楼层

回帖奖励 +2 鱼币

这个习题不错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 08:39:17 | 显示全部楼层
谢谢楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 08:46:38 | 显示全部楼层

回帖奖励 +2 鱼币

观摩大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 11:25:10 | 显示全部楼层
学到啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-30 20:42:26 | 显示全部楼层

回帖奖励 +2 鱼币

不错不错,支持一下~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-22 12:17:55 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[i];
                        if (aSource.equals(substring)) {
                                return true;
                        }
                }
                return false;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-23 16:46:00 | 显示全部楼层

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

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

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

测试结果

测试结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[i];
                        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[8];
                System.out.print("初始化数组为:");
                for (int i = 0; i < 8; i++) {
                        initialArray[i] = new RandomString().main();
                        System.out.print(initialArray[i]);
                        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[n].charAt(0);
                                int tempB = (int) initialArray[n+1].charAt(0);
                                //将小写字母的值减去32,就不区分大小写了
                                if (tempA > 96) {
                                        tempA -= 32;
                                }
                                if (tempB > 96) {
                                        tempB -= 32;
                                }
                                if (tempA > tempB) {
                                        String temp = initialArray[n];
                                        initialArray[n] = initialArray[n+1];
                                        initialArray[n+1] = temp ;
                                }
                        }
                }
                System.out.print("排序后的数组为:");
                for (int i = 0; i < 8; i++) {
                        System.out.print(initialArray[i]);
                        System.out.print(" ");
                }
                System.out.println();
        }
}
可以看一下运行结果:
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[i1] + targetList[i2] + targetList[i3] + targetList[i4] + targetList[i5];
                                                        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,所以有点慢,小心电脑卡死。
可以看看效果:
2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-24 16:41:22 | 显示全部楼层
上面的代码还能写成一个return返回的方法,一个return就能终结所有for循环,可以尝试一下。

递归的就不写了,哈哈哈哈哈哈。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-28 14:13:00 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-2 19:11:05 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-24 15:29:55 | 显示全部楼层
谢谢楼主分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-7-2 13:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表