// 整体思路:先排序,再统计
// 对源字符串进行从小到大冒泡排序,输出排好序的字符串
function bubble(str) {
var arr = [];
if (typeof str == "string") { // 判断是否为字符串
arr = str.split(''); // 字符串切成数组
var len = arr.length; // 数组长度
//冒泡排序核心逻辑:
for (var i = 0; i < len - 1; i++) {
for (var j = i + 1; j < len; j++) {
if (arr[j] < arr[i]) { // 从小到大排
//互换位置
var x = arr[i];
arr[i] = arr[j];
arr[j] = x;
}
}
}
}
return arr.join(''); // 数组转化成字符串返回
}
// 统计有序字符串
// 思路:对于有序字符串,有一个特点,相同的字符是连续出现的,从开始出现到结束出现,然后才排到下一个字符
// 根据上述规律,可以通过比较每种字符在字符串中首次出现的位置与末次出现位置之差,其中差最大的说明是出现次数最多的
// 帮助理解的字符串:abcefooooppxyzz,很明显,o首次出现位置为5,末次出现位置为8,8-5=3,o是该字符串中首末位置差最大的,说明o出现次数最多,位置差3加1即为出现次数4
function static(str) {
var obj = {
count: 0,
character: ''
}
if (typeof str == "string") {
var len = str.length;
for (var i = 0; i < len; ++i) { // 这里用的++i,++在前,立刻加1,即立刻自加1,为啥?是让下面i跳至末次出现位置后,再向后走1位转到下一个新字符的首次出现位置
var se = str.lastIndexOf(str[i]) - i + 1; //相同字符的下标差 + 1 即为相同字符出现次数
if (obj.count < se) {
obj.count = se;
obj.character = str[i];
}
i = str.lastIndexOf(str[i]); // i的下标直接跳至当前字符末次出现的位置
}
}
console.log(JSON.stringify(obj, 0, 4)); // 打印输出obj
return obj;
}
// 验证代码
var s = "abcoefoxyozzopp";
static(bubble(s));
//上面将s传入冒泡函数bubble,然后将冒泡函数的返回值传入static函数,从而得到想要的结果
//下面为上述过程中的数据流向:
// "abcoefoxyozzopp" -> "abcefooooppxyzz" ->
// {
// "count": 4, //出现次数
// "character": "o" //字符
// }
// 小结:上面用到的知识点:
// 1、for循环编码基础,理解for循环的运转规律
// 2、数组的循环遍历,以后会常用
// 3、if语句的用法
// 4、用于判断变量类型的typeof
// 5、用于字符串转数组的split
// 6、用于得到字符在字符串中末次出现位置的lastIndexOf