练习一:模拟trim()方法
public class Test {
public static void main(String[] args){
String str = " asdfa ";
String str2 = myTrim(str);
System.out.println("<"+str+">");
System.out.println("<"+str2+">");
}
public static String myTrim(String str){
int start = 0; //字符串的前角标
int end = str.length()-1; //字符串的后角标
/*先进行角标判断(start不能超过end);再进行字符串中角标为start的字符是否为' '
*如果为空格,则start的角标向后一步,知道start角标的字符部位空格,start角标自加停止
* */
while(start <= end && str.charAt(start) == ' '){
start++;
}
/*先进行角标判断(start不能超过end);再进行字符串中角标为end的字符是否为' '
*如果为空格,则end的角标向前一步,知道start角标的字符部位空格,start角标自减停止
* */
while(start <= end && str.charAt(end) == ' '){
end--;
}
/*将字符串中角标为start与end之间的子串截取出来,注意包含头,不会包含尾,end要加1*/
return str.substring(start,end+1);
}
}
练习二:将字符串反转
public class Test {
public static void main(String[] args){
String str = " ad cb ";
System.out.println(str);
System.out.println(reverseString(str));
}
public static String reverseString(String str){
/*将字符串转换为字符数组*/
char arr[] = str.toCharArray();
/*将字符数组前后调换*/
reverse(arr);
/*将字符数组转化为字符串*/
return new String(arr);
}
public static void reverse(char[] arr){
for(int start = 0,end = arr.length-1;start<end;start++,end--){
swap(arr,start,end);
}
}
public static void swap(char[] arr,int x,int y){
/*数组为引用数据类型,所以只需相互交换,不需要返回就可以实现,其实在对内存中数组已经相互交换了*/
char temp;
temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
现在增加一个需求:实现字符串中指定角标的互换。
public class Test {
public static void main(String[] args){
String str = " ad cb ";
System.out.println(str);
System.out.println(reverseString(str));
}
public static String reverseString(String str,int start,int end){
/*将字符串转换为字符数组*/
char arr[] = str.toCharArray();
/*将字符数组前后调换*/
reverse(arr,start,end);
/*将字符数组转化为字符串*/
return new String(arr);
}
public static String reverseString(String str){
return reverseString(str,0,str.length());
}
public static void reverse(char[] arr,int x,int y){
for(int start = x,end = y-1;start<end;start++,end--){
swap(arr,start,end);
}
}
public static void swap(char[] arr,int x,int y){
/*数组为引用数据类型,所以只需相互交换,不需要返回就可以实现,其实在对内存中数组已经相互交换了*/
char temp;
temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
练习三:获取一个字符串在另一个字符串中出现的次数
public class Test {
public static void main(String[] args){
String str = "asdkkadsfasdkkadsfkksdfktk";
System.out.println(getSubCount(str,"kk"));
}
public static int getSubCount(String str,String key){
int index = 0;
int count = 0;
while((index=str.indexOf(key, index)) != -1){
System.out.println("index= "+index);
index = index + key.length();
count++;
}
return count;
}
}
练习四:获取两个字符串中相同的最大字符串
首先:要对长度较短的字符串进行长度依次递减的子串打印
public class Test {
public static void main(String[] args){
String s1 = "asfhellosdfa";
String s2 = "whellow";
System.out.println(getMaxSubString(s1,s2));
}
public static String getMaxSubString(String s1,String s2){
String temp;
String max = "",min = "";
max = (s1.length()>s2.length())?s1:s2;
min = (max == s1)?s2:s1;
for(int sublength = 0;sublength < min.length();sublength++){
for(int start = 0,end = min.length()-sublength;end < min.length()+1;start++,end++){
temp = min.substring(start,end);
// System.out.println(temp);
if(max.contains(temp))
return temp;
}
}
return "";
}
}
注意:
大圈套小圈原理中,最外层的递增是:整个字符串要减去的字符串的长度(第一轮要
减去0个,得到
一个子串,然后对这一个子串进行判断;第二轮要
减去一个,得到
两个子串,然后对这两个子串进行判断;第三轮要
减去两个,得到
三个子串,然后对这三个子串分别进行判断、、、、、、)