反转字符串2-力扣541

题目:

给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。

示例:

输入: s = "abcdefg", k = 2
输出: "bacdfeg"

解题思路:首先判断字符串是否为空,为空返回null。然后判断K是否为0,如果为0,直接返回原字符串。如果前面都没有返回。则判断这个字符串包含多少个2k长度,用字符串长度除2k可获得。因为在2k长度内反转前k个字符已确定,这个首先完成。然后字符串长度对2K取余,获得余下的字符的长度,如果这个长度大于k,则反转前k个,剩余的不变,如果小于等于k,则全部反转。

代码如下:

class Solution {
    //力扣541
    public void rever(char[] s,int start,int end){ //反转函数的实现
        char temp = '0';
        int high = end;
        for (int i = start; i <= (end + start) / 2; i++) {
            temp = s[i];
            s[i] = s[high];
            s[high] = temp;
            high--;
        }
    }

    public String reverseStr(String s, int k) {    
        Solution solution = new Solution();
        char[] pop = s.toCharArray();    //字符串转为数组操作
        int str = s.length();
        int nums = 0;
        if(k == 0){
            return s;
        }
        if(str == 0){
            return null;
        }

        int t = str / (2 * k);    //获得包含多少个2k长度
        int q = str % (2 * k);    //获得除了完整2k外余下的长度
        for (int i = 0; i < t; i++) {    //反转完整的2k
            solution.rever(pop, nums + 0, nums + k - 1);
            nums +=  + 2 * k;
        }
        if (q <= k) {            //余下的部分反转
            solution.rever(pop, nums, nums + q - 1);
        } else {
            solution.rever(pop, nums, nums + k - 1);
        }
        String light = String.copyValueOf(pop);    //数组转回字符串
        return light;
    }
}

 

你可能感兴趣的:(牛客练习)