zoukankan      html  css  js  c++  java
  • Java基础 String 裸暴力算法- 五个小练习

      之间的博客,承上启下:  

     Java基础 String/StringBuff 常用操作方法复习/内存分析

    Java数组直接选择排序、sort()排序

    Java基础 String 算法 - 五个练习题目要求:

    /**
     1.模拟一个trim方法,去除字符串两端的空格。
     2.将一个字符串进行反转。将字符串中指定部分进行反转。比如将“abcdefg”反转为”abfedcg”
    */
    /**
     3.获取一个字符串在另一个字符串中出现的次数。
     比如:获取“ ab”在 “abkkcadkabkebfkabkskab”中出现的次数.
     4.获取两个字符串中最大相同子串。比如:
     str1 = "abcwerthelloyuiodef“;str2 = "cvhellobnm"
     提示:将短的那个串进行长度依次递减的子串与较长
     的串比较。
     5.对字符串中字符进行自然顺序排序。
     提示:
     1)字符串变成字符数组。
     2)对数组排序,选择,冒泡,Arrays.sort();
     3)将排序后的数组变成字符串。
     *
     */

    算法代码:(全为裸的暴力代码,)

    import java.lang.reflect.Array;
    import java.util.Arrays;
    
    
    public class Test_String {
        public static void main(String[] args) {
            //1.
            myTrim(" 12 123 234 ");myTrim("12 123 234 ");
            myTrim("12 123 234");myTrim("  ");
            //2.
            RevString("123456",1,4);
            RevString("123456",3,5);
            RevString("123456",5,5);
            //3.
            CountSubStr("ab","abkkcadkabkebfkabkskab");
            CountSubStr("abkkcadkabkebfkabkskab","abkkbkebfkabkskab");
            CountSubStr("abkkcadkabkebfkabkskab","abkkcadkabkebfkabkskab");
            //4.
            CountLongestSubStr("abkkcadkabkebfkabkskab","abkkbkebfkabkskab");
            CountLongestSubStr("4564698719","145764987134874364");
            //5.
            SortStr("46541324asdvdsd");
            SortStr("465asdAA41324asdvdsd");
        }
        //1.模拟一个trim方法,去除字符串两端的空格。
        public  static void myTrim(String str){
            int start=0,endd=str.length()-1;
            char[] s= str.toCharArray();
            for(int i=0;i<endd;i++){
                if(s[i]==' ')
                    start++;
                else
                    break;
            }
            for(int i=endd;i>=start;i--){
                if(s[i]==' ')endd--;
                else
                    break;
            }
            String s2=new String(s,start,endd-start+1);
            System.out.println("myTrim() :["+str+"] -->["+s2+"]");
        }
        //2.将一个字符串进行反转。将字符串中指定下标的部分进行反转
        public  static void RevString(String str,int st,int ed){
            char[] s= str.toCharArray();
            int len=str.length();
            if(st<0||ed>=len||st>ed){
                System.out.println("Range Error!");return ;
            }
            for(int i=st,j=ed;i<j;i++,j--){
                char temp=s[i];
                s[i]=s[j];
                s[j]=temp;
            }
            String ss=new String(s);
            System.out.println("RevString() "+str+"--指定下标反转-->"+ss);
        }
        //3.获取一个字符串s1在另一个字符串s2中出现的次数。
        public  static int CountSubStr(String str1,String str2) {
            char[] s1= str1.toCharArray();int len1=str1.length();
            char[] s2= str2.toCharArray();int len2=str2.length();
                        //枚举母串的起点和终点的位置,进行裸匹配
            int cnt=0;
            for(int i=0;i<s2.length;i++){
                int j=i+len1-1;
                if(j>=len2){
                    break;
                }
                    int flag=0;
                    for(int k=i;flag==0 && k<=j;k++){
                        if(s1[k-i]!=s2[k])
                            flag=1;
                    }
                    if(flag==0){
                        cnt++;
                    //    System.out.println("****"+i+" "+j);
                    }
            }
            System.out.println("CountSubStr() "+str1+" in "+str2+" counting "+cnt+" times!");
            return cnt;
        }
        public  static int CountSubStr2(String str1,String str2) {  //为第四题做准备,只是删去了输出!
            char[] s1= str1.toCharArray();int len1=str1.length();
            char[] s2= str2.toCharArray();int len2=str2.length();
            //枚举母串的起点和终点的位置,进行裸匹配
            int cnt=0;
            for(int i=0;i<s2.length;i++){
                int j=i+len1-1;
                if(j>=len2){
                    break;
                }
                int flag=0;
                for(int k=i;flag==0 && k<=j;k++){
                    if(s1[k-i]!=s2[k])
                        flag=1;
                }
                if(flag==0){
                    cnt++;
                    //    System.out.println("****"+i+" "+j);
                }
            }
            return cnt;
        }
        //4.获取两个字符串中最大相同子串
        public  static void CountLongestSubStr(String sonstr,String str){
            char[] s1= sonstr.toCharArray();
            char[] s2= str.toCharArray();
            int ans_len=0;        ///解决思路:直接枚举子串的所有子串,然后一一跟母串进行匹配
            String ansString="";
            for(int i=0;i<s1.length;i++){
                for(int j=i+1;j<s1.length;j++){
                    int num=CountSubStr2(new String(s1,i,j-i+1),str);
                    if(num>0&&ans_len<(j-i+1)){
                        ans_len=j-i+1;
                        ansString=new String(s1,i,j-i+1);
                    }
                }
            }
            System.out.println("CountLongestSubStr() "+sonstr+" & "+str+" is ["+ansString+
                    "],len is "+ans_len);
        }
        

    //5.字符串变成字符数组。2)对数组排序
        public static void SortStr(String str){
            char s[]=str.toCharArray();
            Arrays.sort(s);
            System.out.println("SortStr() "+str+"-->"+ "["+new String(s)+"]" );
        }
    }

     输出结果:

    myTrim() :[ 12 123 234 ] -->[12 123 234]
    myTrim() :[12 123 234 ] -->[12 123 234]
    myTrim() :[12 123 234] -->[12 123 234]
    myTrim() :[  ] -->[]
    RevString() 123456--指定下标反转-->154326
    RevString() 123456--指定下标反转-->123654
    RevString() 123456--指定下标反转-->123456
    CountSubStr() ab in abkkcadkabkebfkabkskab counting 4 times!
    CountSubStr() abkkcadkabkebfkabkskab in abkkbkebfkabkskab counting 0 times!
    CountSubStr() abkkcadkabkebfkabkskab in abkkcadkabkebfkabkskab counting 1 times!
    CountLongestSubStr() abkkcadkabkebfkabkskab & abkkbkebfkabkskab is [bkebfkabkskab],len is 13
    CountLongestSubStr() 4564698719 & 145764987134874364 is [9871],len is 4
    SortStr() 46541324asdvdsd-->[12344456adddssv]
    SortStr() 465asdAA41324asdvdsd-->[12344456AAaaddddsssv]

    测试结果正确不代表算法完全正确, 本文章仅供参考!

  • 相关阅读:
    Luogu 1080 【NOIP2012】国王游戏 (贪心,高精度)
    Luogu 1314 【NOIP2011】聪明的质检员 (二分)
    Luogu 1315 【NOIP2011】观光公交 (贪心)
    Luogu 1312 【NOIP2011】玛雅游戏 (搜索)
    Luogu 1525 【NOIP2010】关押罪犯 (贪心,并查集)
    Luogu 1514 引水入城 (搜索,动态规划)
    UVA 1394 And Then There Was One / Gym 101415A And Then There Was One / UVAlive 3882 And Then There Was One / POJ 3517 And Then There Was One / Aizu 1275 And Then There Was One (动态规划,思维题)
    Luogu 1437 [HNOI2004]敲砖块 (动态规划)
    Luogu 1941 【NOIP2014】飞扬的小鸟 (动态规划)
    HDU 1176 免费馅饼 (动态规划)
  • 原文地址:https://www.cnblogs.com/zhazhaacmer/p/9818109.html
Copyright © 2011-2022 走看看