• 网易2017算法题-调整队形


    题目来源自牛客网的网易算法题,如有侵权行为请告知删除。

    题目是这样的:
      在幼儿园有n个小朋友排列为一个队伍,从左到右一个挨着一个编号为(0~n-1)。其中有一些是男生,有一些是女生,男生用'B'表示,女生用'G'表示。小朋友们都很顽皮,当一个男生挨着的是女生的时候就会发生矛盾。作为幼儿园的老师,你需要让男生挨着女生或者女生挨着男生的情况最少。你只能在原队形上进行调整,每次调整只能让相邻的两个小朋友交换位置,现在需要尽快完成队伍调整,你需要计算出最少需要调整多少次可以让上述情况最少。例如:GGBBG -> GGBGB -> GGGBB,这样就使之前的两处男女相邻变为一处相邻,需要调整队形2次。

    输入描述:
      输入数据包括一个长度为n且只包含G和B的字符串.n不超过50.
    输出描述:
      输出一个整数,表示最少需要的调整队伍的次数
    输入例子:
      GGBBG
    输出例子:
      2
      
      让男生挨着女生或者女生挨着男生的情况最少,就是左边全部是G右边全部是B或者左边全部是B右边全部是G,这样只需要在G全部调整到左边和G全部调整到右边两种情况下取最小调整次数即可,故只用知道最初的位置以及调整完成最终的位置。若将G全部调整到左边,则先计算G的所有下标之和sumG,以及调整后最终G的下标0,1,2,...numG-1的和,即(numG-1)*numG/2,两者之差就是最小调整次数。同理,将G全部调整到右边相当于将B全部调整到左边,对B进行上述计算即可。

    程序如下:

        process.stdin.resume();//回复输入流
        process.stdin.setEncoding('utf8');
        
        var input_stdin = "";//输入的全部数据
        var input_stdin_array = "";//输入的每行数据以数组形式存在
        var input_currentline = 0;//输入的行数
        
        process.stdin.on('data', function (data) {//接收输入的数据
            input_stdin += data;
            if(data.slice(0,-1)==''){
                process.stdin.emit('end');//输入空的回车结束输入
            }
        });
        
        process.stdin.on('end', function () {//end触发
            input_stdin_array = input_stdin.split("
    ");
            main();//对输入进行操作
        });
        
        function readLine() {
            return input_stdin_array[input_currentline++];//读取每一行的数据
        }
        
        function main(){
            var str=readLine().split('');//将输入字符串转化为数组
            var min=0;
            var numG=0,numB=0,sumG=0,sumB=0;
            for(var i=0;i<str.length;i++){
                if(str[i]=='G'){
                    sumG +=i;
                    numG++;
                }else {
                    sumB +=i;
                    numB++;
                }
            }
            //0到numG-1的和为(numG-1)*numG/2
            min=Math.min(sumG-(numG-1)*numG/2,sumB-(numB-1)*numB/2);
            console.log(min);
        }
    
  • 相关阅读:
    Linux中后台执行scp
    无意中发现一个开源的flv播放器
    Spark Label 可以显示多行,但 MX Label 不可以。
    牛到家的Flex效果
    回去研究一下rawChild
    这几天在做图片滤镜
    黑白图片滤镜
    Flash CS3里的滤镜在窗品>属性里,默认是不显示的,你点了后会出现在属性控制面板里
    currentFrameLabel和currentLabel的区别在于flash player9和10
    Flash游戏做html网页做不了的事
  • 原文地址:https://www.cnblogs.com/aicanxxx/p/6907129.html
Copyright © 2020-2023  润新知