鱼C论坛

 找回密码
 立即注册
查看: 3932|回复: 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的随机字符串,随机字符有可能是数字,大写字母或者小写字母

给点提示: 数字和字符之间可以通过互相转换

  1. char c = 'A';
  2. 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 | 显示全部楼层
我写一个第一题的答案,随机生成字符串的答案。
写的不算好,很多地方比较复杂,比如将类型多次转换,判定条件复杂等等,但能作为一个参考。
  1. package first.test.Demo;

  2. public class RandomString {
  3.         public static void main(String[] args) throws Exception {
  4.                 //生成需要判断的数字,对应字符A-Z 0-9
  5.                 String targetNum[] = new String[] {"48","49","50","51","52","53","54","55","56","57"};
  6.                 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"};
  7.                 int i = 1;
  8.                 String temp = "";
  9.                 while (i <= 5) {
  10.                         String number = String.valueOf((int) (Math.random()*100));
  11.                         if (isIn(number, targetNum)) {  //如果为数字,转为0-9
  12.                                 int number_int = Integer.valueOf(number);
  13.                                 char c =  (char) number_int;
  14.                                 temp += c;
  15.                                 i += 1;
  16.                         } else if (isIn(number, targetLetter)) {  //判断是否为字母
  17.                                 if (((int) (Math.random()*100)) % 2 == 1) {  //用随机数判断,如果为奇数则为小写字母
  18.                                         int number_int = Integer.valueOf(number) + 32;
  19.                                         char c =  (char) number_int;
  20.                                         temp += c;
  21.                                         i += 1;
  22.                                 } else {
  23.                                         int number_int = Integer.valueOf(number);
  24.                                         char c =  (char) number_int;
  25.                                         temp += c;
  26.                                         i += 1;
  27.                                 }
  28.                         } else {
  29.                                 continue;
  30.                         }
  31.                 }
  32.                 System.out.println(temp);
  33.         }
  34.         //判断生成数是否在目标数组中
  35.         private static boolean isIn(String substring, String[] source) {
  36.                 for (int i = 0; i < source.length; i++) {
  37.                         String aSource = source[i];
  38.                         if (aSource.equals(substring)) {
  39.                                 return true;
  40.                         }
  41.                 }
  42.                 return false;
  43.         }
  44. }
复制代码

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

使用道具 举报

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

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

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

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

测试结果

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

使用道具 举报

发表于 2020-7-24 15:36:20 | 显示全部楼层
今天补充第二题答案。
首先,将昨天的类RandomString稍作修改,方法main()返回目标字符串:
  1. package first.test.Demo;

  2. public class RandomString {
  3.         public String main() throws Exception {
  4.                 //生成需要判断的数字,对应字符A-Z 0-9
  5.                 String targetNum[] = new String[] {"48","49","50","51","52","53","54","55","56","57"};
  6.                 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"};
  7.                 int i = 1;
  8.                 String temp = "";
  9.                 while (i <= 5) {
  10.                         String number = String.valueOf((int) (Math.random()*100));
  11.                         if (isIn(number, targetNum)) {  //如果为数字,转为0-9
  12.                                 int number_int = Integer.valueOf(number);
  13.                                 char c =  (char) number_int;
  14.                                 temp += c;
  15.                                 i += 1;
  16.                         } else if (isIn(number, targetLetter)) {  //判断是否为字母
  17.                                 if (((int) (Math.random()*100)) % 2 == 1) {  //用随机数判断,如果为奇数则为小写字母
  18.                                         int number_int = Integer.valueOf(number) + 32;
  19.                                         char c =  (char) number_int;
  20.                                         temp += c;
  21.                                         i += 1;
  22.                                 } else {
  23.                                         int number_int = Integer.valueOf(number);
  24.                                         char c =  (char) number_int;
  25.                                         temp += c;
  26.                                         i += 1;
  27.                                 }
  28.                         } else {
  29.                                 continue;
  30.                         }
  31.                 }
  32.                 return temp;
  33.         }
  34.         //判断生成数是否在目标数组中
  35.         private static boolean isIn(String substring, String[] source) {
  36.                 for (int i = 0; i < source.length; i++) {
  37.                         String aSource = source[i];
  38.                         if (aSource.equals(substring)) {
  39.                                 return true;
  40.                         }
  41.                 }
  42.                 return false;
  43.         }
  44. }
复制代码


然后创建类StringRank,用RandomString生成目标数组,再用冒泡法排序:
  1. package first.test.Demo;

  2. public class StringRank {
  3.         public static void main(String[] args) throws Exception {
  4.                 String initialArray[] = new String[8];
  5.                 System.out.print("初始化数组为:");
  6.                 for (int i = 0; i < 8; i++) {
  7.                         initialArray[i] = new RandomString().main();
  8.                         System.out.print(initialArray[i]);
  9.                         System.out.print(" ");
  10.                 }
  11.                 System.out.println();
  12.                 //冒泡排序,从小到大
  13.                 for (int m = (initialArray.length - 1); m > 0; m--) {
  14.                         for (int n = 0; n < m; n++) {
  15.                                 int tempA = (int) initialArray[n].charAt(0);
  16.                                 int tempB = (int) initialArray[n+1].charAt(0);
  17.                                 //将小写字母的值减去32,就不区分大小写了
  18.                                 if (tempA > 96) {
  19.                                         tempA -= 32;
  20.                                 }
  21.                                 if (tempB > 96) {
  22.                                         tempB -= 32;
  23.                                 }
  24.                                 if (tempA > tempB) {
  25.                                         String temp = initialArray[n];
  26.                                         initialArray[n] = initialArray[n+1];
  27.                                         initialArray[n+1] = temp ;
  28.                                 }
  29.                         }
  30.                 }
  31.                 System.out.print("排序后的数组为:");
  32.                 for (int i = 0; i < 8; i++) {
  33.                         System.out.print(initialArray[i]);
  34.                         System.out.print(" ");
  35.                 }
  36.                 System.out.println();
  37.         }
  38. }
复制代码

可以看一下运行结果:
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-24 16:34:39 | 显示全部楼层
害,干脆再写写第三题答案,用for循环实现:
  1. package first.test.Demo;

  2. public class ForLoop {
  3.         public static void main(String[] args) throws Exception {
  4.                 String password = new RandomString().main();
  5.                 System.out.println(password);
  6.                 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"};
  7.                 String temp = "";
  8.                 for (int i1 = 0; i1 < targetList.length; i1++) {
  9.                         for (int i2 = 0; i2 < targetList.length; i2++) {
  10.                                 for (int i3 = 0; i3 < targetList.length; i3++) {
  11.                                         for (int i4 = 0; i4 < targetList.length; i4++) {
  12.                                                 for (int i5 = 0; i5 < targetList.length; i5++) {
  13.                                                         temp = targetList[i1] + targetList[i2] + targetList[i3] + targetList[i4] + targetList[i5];
  14.                                                         if (password.equals(temp)) {
  15.                                                                 System.out.println("i1 = " + i1);
  16.                                                                 System.out.println("i2 = " + i2);
  17.                                                                 System.out.println("i3 = " + i3);
  18.                                                                 System.out.println("i4 = " + i4);
  19.                                                                 System.out.println("i5 = " + i5);
  20.                                                                 break;
  21.                                                         }
  22.                                                 }
  23.                                                 if (password.equals(temp)) {
  24.                                                         break;
  25.                                                 }
  26.                                         }
  27.                                         if (password.equals(temp)) {
  28.                                                 break;
  29.                                         }
  30.                                 }
  31.                                 if (password.equals(temp)) {
  32.                                         break;
  33.                                 }
  34.                         }
  35.                         if (password.equals(temp)) {
  36.                                 break;
  37.                         }
  38.                 }
  39.                 System.out.println("找到目标密码为:" + temp);
  40.         }
  41. }
复制代码

这里用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-4-25 15:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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