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

