题解 | #牛牛的字符串#

牛牛的字符串

http://www.nowcoder.com/practice/0cc3b103e43f4ec093be586df292822e

观察规律:

1、可以首先将字符串分为k个独立的子串分别处理,每个子串的步长是k
2、如果相同字符串中,一个字符串的前面有x个字符比这个字符小,那么乱序数为x,所有字符的乱序数的和为该字符串的乱序数n
3、如果一个字符串的字符乱序数为n,那么需要n步来对数组进行从大到小排序
处理独立子串:在遍历过程中,将每个字符出现过的次数存储在辅助数组num[26]中。在遍历到每一个字符时都遍历num[26],计算出相同子串的前面出现过的比自己小的那些字符的数量,也就是可以交换的最大次数steps

import java.util.*;
public class Solution {
    /**
     * 
     * @param s string字符串 s.size() <= 1e5
     * @param k int整型 k <= s.size()
     * @return int整型
     */
    public int turn (String s, int k) {
        // write code here
        int len = s.length();
        int steps = 0;
        int index = 0;
        //先写分为k组
        for(int i = 0;i<k;i++){
            //分组遍历,遍历过程中统计已经遍历过的比自己小的字符的个数
            int[] num = new int[26];//记录容器
            for(int j = i;j<len;j=j+k){
                index = s.charAt(j)-'a';
                num[index] = num[index]+1;
                for(int m = 0; m < index;m++){
                    steps+=num[m];
                }
            }
        }
        return steps;
    }
}

感悟

  • 不要总想着遍历全部的信息,多思考怎么通过已经遍历过的信息来解决问题
  • 通过存储过去,减轻未来负担,空间换时间
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务