打字按键次数

题目来自于:https://www.acmcoder.com/#/practice/code
题目描述:

小明很喜欢打字,今天小红给了小明一个字符串。这个字符串只包含大写和小写字母。 我们知道,按下CapsLock键,可以切换大小写模式。我们在小写模式时候,同时按下shift+字母键,就能写出大写字母。在大写模式的时候,按下shift+字母键,就能写出小写字母。现在问题来了,给你一个字符串,问你最少使用多少个按键,就可以写出这个字符串呢?注意,按shift和字母键,算两次按键。开始时均为小写状态。

输入描述:数据一个字符串s,s的长度小于等于100。仅包含大小写字母。

输出描述:对于每组数据,输出最少按键次数。

样例输入: AAAAAA
样例输出: 7

我能想到的只有最笨的办法。。。。

1、将连续大写或小写字母截取成类似于[['a', 'a'],['A', 'A', 'A'],['a']]的数组

2、根据当前大小写模式,以及将要输入的字母大小写,判断采取CapsLock还是shift的方式打字,计算按键次数

var printOut = function(text){
    var arr = text.split('');
    var count = 0;
    var newarr = [];
    var flag = 'xiao'
    //1、将连续大写或小写字母截取成类似于[['a', 'a'],['A', 'A', 'A'],['a']]的数组
    while(arr.length){
        if(arr[0]>= 'a' && arr[0] <= 'z'){
            var DaxieIndex = arr.findIndex((item,index)=>{
                if(item >= 'A' && item <= 'Z'){
                    //arr[0]是小写,找到跟第一个大写字母的位置,将小写的字母截取push到newarr
                    return index
                }
            })
         //找到即截取执行push,没找到即把剩余arr全部截取,即跳出循环
         DaxieIndex===-1 ? newarr.push(arr.splice(0,arr.length)): newarr.push(arr.splice(0,DaxieIndex))
        }else{
            var XiaoxieIndex = arr.findIndex((item,index)=>{
                if(item >= 'a' && item <= 'z'){
                    //arr[0]是大写,找到跟第一个小写字母的位置,将大写的字母截取push到newarr
                    return index
                }
            });
           //找到则截取执行push,没找到则把剩余arr全部截取,即跳出循环
           XiaoxieIndex===-1 ? newarr.push(arr.splice(0,arr.length)): newarr.push(arr.splice(0,XiaoxieIndex))
        }
    }
    console.log(newarr)
    //2、计算按键次数
    //	+ 当前flag是小写状态时,
    //  	若item[0]为单个大写字母则shift+字母,count+=2,
    //		若item[0]为多个大写字母则CapsLock+字母,count+=(item.length + 1), 并切换flag为大写状态
    //		若item[0]为小写字母,则count+=item.length
    //	+ 当前flag是大写状态时,
    //  	若item[0]为单个小写字母则shift+字母,count+=2,
    //		若item[0]为多个小写字母则CapsLock+字母,count+=(item.length + 1),  并切换flag为小写状态
    //		若item[0]为大写字母,则count+=item.length
    newarr.forEach((item,index)=>{
        if(flag === 'da'){
            if(item[0] >= 'a' && item[0] <= 'z'){
                if(item.length>1){
                    flag = 'xiao'
                    count += (item.length + 1)
                }else{
                    count += 2
                }
            }else{
                count += item.length 
            }
        }else{
            if(item[0] >= 'A' && item[0] <= 'Z'){
                if(item.length>1){
                    flag = 'da'
                    count += (item.length + 1)
                }else{
                    count += 2
                }
            }else{
                count += item.length 
            }
        }
    })
    console.log(count)
};
printOut('aaaAAAaAAAAaassDDD')

结果:

//newarr----------------------
(6)[Array(3), Array(3), Array(1), Array(4), Array(4), Array(3)]
0: (3) ['a', 'a', 'a']
1: (3) ['A', 'A', 'A']
2: ['a']
3: (4) ['A', 'A', 'A', 'A']
4: (4) ['a', 'a', 's', 's']
5: (3) ['D', 'D', 'D']
//count----------------------
22
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值