字符串旋转逆序操作

对字符串进行旋转必须操作

案例1

判断一个字符串是否为另一个字符串的旋转字符串
例如:1234 的旋转字符串为: 1234 2341 3412 4123
可以新建字符串 str = 12341234;(两个字符串叠加,其中包含了所有该字符串的旋转字符串)
只要判断 str 中包含了字符,则其就是旋转字符串

public boolean chkRotation(String A, int lena, String B, int lenb) {
        // write code here
     return (A+A).contains(B);    
}

案例2

将 str1 = pig loves dog 逆序成 str2 = god loves pig
1、将字符串 str1 头尾交换,直到中间为止,得到:god sevol gip
2、再将每一个单词逆序,得到:dog loves pig

public static String reverseSentence(String A, int n) {
    if (A == null || n == 0) {
        return A;
    }
    char[] s = A.toCharArray();
    rotateWord(s);
    return String.valueOf(s);
}

private static void rotateWord(char[] chars) {
    if (chars == null || chars.length == 0) {
        return;
    }
    reverse(chars, 0, chars.length-1);//字符串整体逆序
    //至此字符串变为:gip sevol god
    int left = -1;
    int right = -1;
    for (int i = 0; i < chars.length; i++) {//逐个单词再逆序
        if (chars[i] != ' ') {//找出单词的左右索引
            left = i == 0 || chars[i - 1] == ' ' ? i : left;
            right = i == chars.length - 1 || chars[i + 1] == ' ' ? i : right;
        }
        if (left != -1 && right != -1) {//对单词进行逆序
            reverse(chars, left, right);
            left = -1;
            right = -1;
        }
    }
}

private static void reverse(char[] chas, int start, int end) {//逆序代码
    char temp;
    while (start < end) {
        temp = chas[start];
        chas[start] = chas[end];
        chas[end] = temp;
        start++;
        end--;
    }
}

案例3

将字符串 ABCDE 的第[0-2]位移动到[3-end]后面,即:DEABC
1、将ABCDE的[0 1 2]部分的字符串逆序:CBADE
2、将ABCDE的[3 4]部分的字符串逆序:CBAED
3、将整体逆序:DEABC

/**
 * 字符串移位
 * 1、将ABCDE的[0 1 2]部分的字符串逆序:CBADE
 * 2、将ABCDE的[3 4]部分的字符串逆序:CBAED
 * 3、将整体逆序:DEABC
 */
public static String stringTranslation(String A, int n, int len) {
    // write code here
    if (A == null || n == 0) {
        return A;
    }
    char[] s = A.toCharArray();
    reverse(s, 0, len - 1);
    reverse(s, len, n - 1);
    reverse(s, 0, n - 1);
    return String.valueOf(s);
}
private static void reverse(char[] chas, int start, int end) {//逆序代码
    char temp;
    while (start < end) {
        temp = chas[start];
        chas[start] = chas[end];
        chas[end] = temp;
        start++;
        end--;
    }
}

案例4

给定字符串类型的数组 strs ,要求找到一种拼接书序,将数组中所有的字符串进行拼接,保证拼接之后的字符串是字典书序最小
例如: strs = {“abc","de"},可以拼接成 "abcde" 和 "deabc" 但是"abcde"字典书序更小,所以返回"abcde"
对字符串数组进行排序:
如果 str1 + str2 < str2 + str1,则str1放在前面,否则,str2放在前面

//思路:对字符串数组进行排序:
//如果 str1 + str2 < str2 + str1,则str1放在前面,否则,str2放在前面
public static void main(String[] args) {
    String[] test = new String[]{"abc","de"};
    System.out.println(findSmallest(test, 2));
}

private static String findSmallest(String[] strs, int n) {
    // write code here
    sortArrs(strs, n);
    return toString(strs, n);
}

private static String toString(String[] arrs, int n) {
    String res ="";
    for (int i = 0; i < n; i++) {
        res += arrs[i];
    }
    return res;
}
private static void sortArrs(String[] arrs, int n) {
    for (int i = 0; i < n-1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if ((arrs[j] + arrs[j + 1]).compareTo(arrs[j + 1] + arrs[j]) > 0) {
                String temp = arrs[j + 1];
                arrs[j + 1] = arrs[j];
                arrs[j] = temp;
            }
        }
    }
}


//解法二
public class MyComparator implements Comparator<String> {
    @Override
    public int compare(String a, String b) {
        return (a + b).compareTo(b + a);
    }
}

public String findSmallest(String[] strs, int n) {
    if (strs == null || n == 0) {
        return "";
    }
    // 根据新的比较方式排序
    Arrays.sort(strs, new MyComparator());
    String res = "";
    for (int i = 0; i < n; i++) {
        res += strs[i];
    }
    return res;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值