题解 | #牛牛的字符串#
牛牛的字符串
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; } }
感悟
- 不要总想着遍历全部的信息,多思考怎么通过已经遍历过的信息来解决问题
- 通过存储过去,减轻未来负担,空间换时间