字符串的算法练习
前言:本文的算法练习来自黑马程序员的黑马程序员2026版AI+Java零基础全套视频课程
文章目录
- 字符串的算法练习
- 1.字符串分离
- 先打印再补零
- 先补零再打印
- 两种写法的对比
- 2.打乱字符串
- 3.字符串计算
1.字符串分离
要求:键盘录入任意字符串,请按长度为 8 拆分每个输入字符串并进行输出
长度不是 8 整数倍的字符串请在后面补数字 0,空字符串不处理。
举例:
输入:abcdabcda
输出:第一行:abcdabcd
第二行:a0000000
先打印再补零
importjava.util.Scanner;publicclasstest{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);System.out.println("请输入字符串");//获取字符串Stringstr=sc.next();//打印每一个字符,然后遇到8就换行//System.out.println()运行后会换行//System.out.print()运行后不会换行for(inti=0;i<str.length();i++){//获取具体位置的字符打印charc=str.charAt(i);System.out.print(c);if((i+1)%8==0){System.out.println();}}//计算最后一行的字符数intlastLineCount=str.length()%8;//计算需要补的零数intcount=8-lastLineCount;//打印0for(inti=0;i<count;i++){System.out.print("0");}}}先补零再打印
importjava.util.Scanner;publicclasstest2{publicstaticvoidmain(String[]args){//1.获取字符串System.out.println("请输入字符串");Scannersc=newScanner(System.in);Stringstr=sc.next();//2.获取需要补的0的数intlastLineCount=str.length()%8;intcount=8-lastLineCount;Strings="00000000".substring(0,count);str=str+s;//3.打印字符串for(inti=0;i<str.length();i+=8){Stringres=str.substring(i,i+8);System.out.println(res);}}}两种写法的对比
第一种只用一个字符串就能实现打印,但是是每一次循环打印一个字符,还要手动再次换行。
第二种用了substring(begin,end)方法,是左取右不取的方法,在打印字符串的时候可以一次性打印出8个字符,并且换行。但是第二种方法需要用到3个字符串来完成。
不过二次开发的时候,比如要把8个一行换成11个一行,第一种解法只用改变几个数字,重新算一下要补的零的个数,而第二种不仅要重新算个数,还要修改"00000000"的字符串。
2.打乱字符串
要求:通过键盘输入字符串,然后打乱顺序,再打印
importjava.util.Random;importjava.util.Scanner;publicclasstest3{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);Randomr=newRandom();System.out.println("请输入字符串:");Stringstr=sc.next();//因为字符串是不能改变的,所以将字符串转为字符数组char[]ch=str.toCharArray();//防止重复字符串的出现booleanflag=true;while(flag){for(inti=0;i<ch.length;i++){//随机生成索引,交换数值intrandomIndex=r.nextInt(ch.length);chartemp=ch[randomIndex];ch[randomIndex]=ch[i];ch[i]=temp;}//将字符数组转换回字符串Stringres=newString(ch);//判断字符串是否重复,不重复就置标志位为false,然后退出循环if(!res.equals(str)){flag=false;System.out.println(res);}}}}黑马程序员给的代码是没有增加字符串重复检查的,这里加了字符串的重复检查就能避免打印出来的不和原本的重复。
3.字符串计算
定义两个字符串,记录为非负整数,求它们的和。 输入: “12395” 和 “133” , 输出: “12528”
注意: 需要数据过大, 超出int取值范围的情况
代码如下
packageAPI_06;publicclasstest4{publicstaticvoidmain(String[]args){//1.创建两个字符串Stringstr1="12359";Stringstr2="133";//2.获取最长字符串数intlen=str1.length()>=str2.length()?str1.length():str2.length();//3.将字符串转化为整型数组int[]arr1=copydata(len,str1);int[]arr2=copydata(len,str2);//4.计算int[]sum=newint[len+1];//进位计算器intnum=0;for(inti=arr1.length-1;i>=0;i--){//将同位的计算结果记录起来inttemp=arr1[i]+arr2[i]+num;//取余来计算此位的数sum[i+1]=temp%10;//取整来计算进位num=temp/10;}//最后要考虑第一位sum[0]=num;StringBuildersb=newStringBuilder();//如果第一位是0则不打印if(sum[0]!=0){sb.append(sum[0]);}for(inti=1;i<sum.length;i++){sb.append(sum[i]);}System.out.println(sb);}publicstaticint[]copydata(intlen,Stringstr){//创建整型数组容器int[]arr=newint[len];//index来记录索引,从后往前intindex=arr.length-1;for(inti=str.length()-1;i>=0;i--){//取每一位的字符charc=str.charAt(i);//通过ASCLL码计算intnum=c-48;arr[index]=num;index--;}returnarr;}}um = c-48;
arr[index] = num;
index–;
}
return arr;
}
}
[外链图片转存中...(img-RQnwRM1a-1778163090564)] [外链图片转存中...(img-ORdzJe8i-1778163090565)] copydata中的逻辑