习题整理
Posted haixiaer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了习题整理相关的知识,希望对你有一定的参考价值。
1、定义一个类:学生 ---姓名(String)--- 年龄(int)----学号(String)--- 重写equals。
equals的重写思路:
地址是否一致;
参数是否为空;
类型是否一致;
属性是否对应相等
1 public boolean equals(Object obj) { 2 if (this == obj) 3 return true; 4 if (obj == null) 5 return false; 6 if (getClass() != obj.getClass()) 7 return false; 8 Student other = (Student) obj; 9 if (age != other.age) 10 return false; 11 if (name == null) { 12 if (other.name != null) 13 return false; 14 } else if (!name.equals(other.name)) 15 return false; 16 if (num == null) { 17 if (other.num != null) 18 return false; 19 } else if (!num.equals(other.num)) 20 return false; 21 return true; 22 }
2、大数据1806 (gbk)---- 按照指定的字节个数来截取这个字符串。4 -> 大数 7 -> 大数据1 5 -> 大数 如果截取出来半个字符,需要舍弃
思路:
要求截取的字符串为空:返回“”;
要求截取的字符串的长度大于原字符串长度:返回原字符串;
不符合以上两种情形:
首先按照指定的字节截取字符串;
其次判断截取后的字符串的最后一个字符是否和原字符串对应位置的字符是否一致;
如果一致,返回该字符串;如果不一致,舍弃最后一位,再返回该字符串。
1 Scanner s = new Scanner(System.in); 2 String str = s.nextLine(); 3 int n = s.nextInt(); 4 5 //将字符串转化为字节数组 6 byte[] bs = str.getBytes("gbk"); 7 8 if(n < 0){ 9 System.out.println(""); 10 return; 11 }else if (n >= bs.length) { 12 System.out.println(str); 13 return; 14 } 15 16 //按照指定的字节进行截取 17 String str1 = new String(bs,0,n,"gbk"); 18 19 //判断最后一个字符 20 if(str1.charAt(str1.length()-1) != 21 str.charAt(str.length()-1)){ 22 str1 = new String(bs,0,n-1,"gbk"); 23 } 24 System.out.println(str1);
3、输入一个字符串以及一个字串,输出这个字串每次出现的位置
关键方法总结:
String类里的indexOf方法,调用实例:a = str1 . indexOf(str,b)。字符串str1在字符串str中从下表b开始,第一次出现的下标为a。
思路:
从第一位开始获取该字符串在原字符串出现的下标并将下标返回,
从返回的下标开始获取该字符串再次出现的下标……
1 Scanner s = new Scanner(System.in); 2 String str = s.nextLine(); 3 String str1 = s.nextLine(); 4 int a = 0; 5 while(a < str.length()){ 6 a = str.indexOf(str1,a); 7 if(a != -1){ 8 System.out.println("出现"+str1+"的位置:"+a); 9 a++; 10 }else { 11 break; 12 } 13 }
正则表达式:
1、输入一个字符串,判断这个字符串是否表示一个小数 10.23 -- true 0.25----true .33---false 5.---不是 00.28----不是 5.00---是
正则表达式:
共有两种情况,
情况一:整数位为0:0\.\d+;
情况二:整数位不为0:[1-9]\d*\.\d+
2、输入一个字符串作为密码,要求判断密码是否合法。合法性:8-12位, 小写字母/大写字母/数字/空格至少出现两种
正则表达式:
{8 , 12} 字符串位数在8-12位
[a - z ] 所有小写字母
[A - Z] 所有大写字母
[0 - 9 ] 所有数字
1 public static boolean check(String pwd){ 2 if(!pwd.matches("[a-zA-Z0-9 ]{8,12}")) 3 return false; 4 //记录次数 5 int count = 0; 6 //判断有没有小写字母 7 if(pwd.matches(".*[a-z].*")) 8 count++; 9 //判断有没有大写字母 10 if(pwd.matches(".*[A-Z].*")) 11 count++; 12 //判断有没有数字 13 if(pwd.matches(".*[0-9].*")) 14 count++; 15 //判断有没有空格 16 if(pwd.matches(".* .*")) 17 count++; 18 return count >=2; 19 }
3、邮箱匹配 @qq.com @163.com @tedu.cn @sina.com.cn
正则表达式:
大致可分为两类邮箱,
其中一种是com结束的:
[0-9a-zA-Z]{5,32}@[0-9a-zA-Z]+\.com
另一种是以cn结束的,其中cn结束的可能之前还包含com:
[0-9a-zA-Z]{5,32}@[0-9a-zA-Z]+(\.com)?(\.cn)
4、输入一个字符串,输出这个字符串中每个字符出现的次数
难点分析:
其中主要注意的是字符串中出现的转义字符:+、*、?、\、.
1 Scanner s = new Scanner(System.in); 2 3 String str = s.nextLine();//"aohaagakhf"; 4 5 while(str.length() > 0){ 6 7 int len = str.length(); 8 9 char a1 = str.charAt(0); 10 11 String regex = ""; 12 13 if(a1 == ‘+‘ || 14 a1 == ‘*‘ || 15 a1 == ‘?‘ || 16 a1 == ‘\‘|| 17 a1 == ‘.‘){ 18 regex = "\" + a1; 19 }else { 20 regex = a1 + ""; 21 } 22 str = str.replaceAll(regex,""); 23 int a11 = len - str.length(); 24 System.out.println(a1+":"+a11);
5、将叠字替换为单字。如:我我我我我我爱爱爱爱爱学学学学学习习习习习 -> 我爱学习
1 String str = "我我我我我我爱爱爱爱爱学学学学学习习习习习"; 2 str = str.replaceAll("(.)\1+", "$1");
6、计算一个字符串的平均碎片长度 --- 任何一个字符串都可以看作是一组叠字或单字拼接成的单位,每一组叠字就是一个碎片。例如:aaaccddac -> aaa cc dd a c -> (3+2+2+1+1)/5=1.8
实现思路:
字符串的原长度就是碎片长度。
将所有的叠字替换成为单字。
替换之后的字符串的长度就是碎片的长度
1 String str = "aaaccddac"; 2 // 获取字符串的原长度 --- 碎片长度 3 double len = str.length(); 4 // 将所有的叠字替换成为单字 5 str = str.replaceAll("(.)\1+", "$1"); 6 // 替换之后的字符串的长度就是碎片的长度 7 double len1 = str.length(); 8 System.out.println(len/len1);
以上是关于习题整理的主要内容,如果未能解决你的问题,请参考以下文章