データ構造の反転文字列

3669 ワード

文字列を反転
タイトル記述:文字列"##We###Are###Family!###""###!ylimaF###erA###eW##"に反転します.
解析と解答:この問題は私達の解答方法がたくさんあります.よくある方法は配列を使って、データ構造の中のStockで反転を完成することを紹介します.
Stockの特徴はFILO(First In,Last Out)である.この特徴は文字列を反転させるのに非常に適しています.コードの実現は以下の通りです.
import java.util.Stack;

public class Demo {
    public static void main(String[] args) {
        System.out.println(ReverseAllStringWithStack("##We###Are###Family!###"));
    }

    public static String ReverseAllStringWithStack(String string) {
        //  string  null   "" ,  string。
        if (string == null || string.length() == 0)
            return string;
        //     Stack,    Character  。     Character   char,
        //               ,    primitive (  )    。
        Stack stringStack = new Stack<>();
        //toCharArray()       char    
        char[] array = string.toCharArray();
        //  for-each       push( ) Stack
        for (Character c : array) {
            stringStack.push(c);
        }
        int length = string.length();
        //  for          ,    
        for (int i = 0; i < length; i++) {
            array[i] = stringStack.pop();
        }
        //String        char[]    ,       String  
        return new String(array);
    }
}

複数の文字列を反転
タイトル記述:文字列"##We###Are###Family!###""###Family!###Are###We##"に反転します.
この問題と上の問題の違いは単語が反転しないことです.解決の考えは二つあります.
  • は、すべての文字列を反転させてから、反転結果の単語をもう一度反転させます.
  • は、まず文字列の単語を反転させ、全体を反転させる.
  • 二つの方式の違いは大きくないです.次のコードは第一の方式の実現です.
    import java.util.Stack;
    
    public class Demo {
        public static void main(String[] args) {
            System.out.println(ReverseAllStringWithStack("##We###Are###Family!###"));
        }
    
        public static String ReverseAllStringWithStack(String stringAll) {
            if (stringAll == null || stringAll.length() == 0)
                return stringAll;
            Stack stringAllStack = new Stack<>();
            char[] array = stringAll.toCharArray();
            for (Character c : array) {
                stringAllStack.push(c);
            }
            int length = stringAll.length();
            for (int i = 0; i < length; i++) {
                array[i] = stringAllStack.pop();
            }
    
            int from = 0, to = 0;//from            ,to     
            String string = null;//         
            for (int i = 0; i < length; ) {
                while (array[i] == '#') {//     '#',    
                    from = ++i;//                + 1,  from = i + 1;i++;->from = ++i
                    if (i >= length)//      
                        break;
                }
                if (i >= length)//      
                    break;
                while (array[i] != '#') {//    '#',    
                    to = i++;//                ,  to = i;i++;->to = i++
                }
                string = ReverseStringWithStack(array, from, to);//         
            }
            return string;
        }
    
        public static String ReverseStringWithStack(char[] array, int from, int to) {
            if (array.length == 0)
                return null;
            for (int i = 0; i < from; i++) {
                while (from < to) {
                    char t = array[from];
                    array[from++] = array[to];//array[from++]->array[from] = array[to];from++;
                    array[to--] = t;
                }
            }
            return new String(array);
        }
    }
    
    
    締め括りをつける#であろうと、スペースなどの記号であろうと、反転方法は同じです.順序が変わらない部分は2回の反転を経ても同じです.
    私たちはIDEAのdubug機能を使って多くのコードエラーを解決できます.多く実践することを提案する.
    この資料を参考にします
  • jurlycoding---回転文字列