给定一个字符串str和一个数组sublen[],sublen[0] + sublen[1] + ... + sublen[sublen.size() – 1] == str.length(),

如题:
在这里插入图片描述
解析:有一个字符串,有一个int的数组,数组各下标的值的和等于字符串的长度,按照数组的下标截取字符串,sublen[0]值为3,截取的第一个子串的长度就是3,也就是substring(0, 3),原字符串去掉前3个。以此类推截取完,原字符串也就被截成了sublen.length个子字符串,然后2k-1个子串与第2k个子串调换,即1和2换,3和4换,如果子串的数量是奇数,最后一个位置不变。位置交换完毕后,各子串按照顺序拼接成一个新的字符串。所以就有:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @author asus
 * @date 2020/08/16
 */
public class Solution {
    /**
     * @param args
     */
    public static void main(String[] args) {
        int[] arr = {3, 2, 2, 1, 1};
        reformatString("abcdefghi", arr);

    }

    /**
     * @param str:
     *            the original string
     * @param sublen:
     *            an integer array
     * @return: the new string
     */
    private static String reformatString(String str, int[] sublen) {
    //计算数组的元素和
        int sum = 0;
        for (int i : sublen) {
            sum = sum + i;
        }
        List<String> sL = new ArrayList<String>(16);
        if (sum == str.length()) {
            int l = sublen.length;

            // sublen[i]表示第i+1个子串的长度
            for (int i = 0; i < l; i++) {
                String e = str.substring(0, sublen[i]);
                str = str.substring(sublen[i], str.length());
                sL.add(e);
            }
                        // 将第2k-1个子串与第2k个子串调换,若有奇数组,则最后一个不变
            int lSize = sL.size();
            if (lSize % 2 != 0) {
                lSize--;
            }
            for (int i = 0; i < lSize; i++) {
                if (i < lSize - 1 && i % 2 == 0) {
                //交换位置
                    Collections.swap(sL, i, i + 1);
                }
            }
        }
        StringBuffer b = new StringBuffer();
        for (String s : sL) {
            b.append(s);
        }
        System.out.print(b.toString());
        return b.toString();
    }

}
`
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值