爱奇艺2018校招前端开发编程题个人解法

爱奇艺2018校招前端开发三道编程题。


第一题是给三个长度不同的棍子,边长可以减,求能组成周长最大的三角形是多长。


第一题代码没有保留,凭记忆写了


解法如下:考虑三角形特性,任意两边之和大于第三边,


样例输入


1 2 3


样例输出


5


思路如下:找出最大边max,最小边min,中间边mid,只要min+mid>max,三角形就能成立,

主要的坑在,每次执行 max - - ;之后,最大边可能会变化,所以要重新对这三条边进行比较,

重新赋值max;min;mid;

最后输出结果,很简单。

这里贴上代码(通过率100%)

    var line;
    var arr=[];
    while(line=readline()){
        arr=line.split(" ");
        var sum=parseInt(arr[0])+parseInt(arr[1])+parseInt(arr[2]);
        var max=Math.max(arr[0],arr[1],arr[2]);
        var min=Math.min(arr[0],arr[1],arr[2]);
        var mid=sum-max-min;

        while(min+mid<=max){
            max--;
            sum=max+min+mid;
            max=Math.max(max,min,mid);
            min=Math.min(max,min,mid);
            mid=sum-max-min;

        }
        sum=max+min+mid;
        print(sum);
    }

不知道有没有bug,代码大体如上。


第二题,一列正方形,R代表红色,G代表绿色,

对正方形可以进行染色操作,要求让需要让每个R都比G更靠近左侧。

样例 s=RGRGR,染色之后变成RRRGG,涂染的正方形个数为2,没有比这个更好(步骤最少)的涂染方案。


输入包括一个字符串s,字符串s长度 length(1<=length<=50),其中值包括'R'或者‘G’,分别表示红色和绿色。


输出一个整数,表示最少需要涂染的正方形数量。


样例输入 

RGRGR

输出

2


这道题我的通过率只有30%,不知道什么原因,有愿意和我探讨的希望能留言评论。


我的想法很简单,先转化为数组,遍历数组元素,设置一个red 数组,用来存出现 R 的数组的下标;

设置一个green 数组,用来存出现 G 的下标,对R和G进行从小到大排序,既然所有R都需要比G更靠近左边,

那么就是说 red数组的最后一个元素也要比green数组的第一个元素小(不知道这里的理解有没有问题);

每次涂一个R,也就是要涂一个G,设置一个count值来计算,涂染的次数,每次累加 2 (涂一个R也要涂一个G)


接下来就是转换成代码罢了,这里我就不按照牛客网的环境写了,直接把本地调试的代码贴上来


这里有一个辅助函数,主要是给数组 的sort 方法用的,

比如数组 arr=[2,1, 20,3];

正常的arr.sort()返回的是  arr.sort() = [1,2,20,3];

而 arr.sort(compare)则可以返回  arr.sort(compare) = [1,2,3,20];

    function compare(){
        if(arguments[0]>arguments[1])
            return 1;
        else if(arguments[0]<arguments[1])
            return -1;
        else
            return 0;

    }

主体部分如下(通过率30%)

    function cal(arr){
        var red=[];
        var green=[];
        var count=0;
        var brr=arr.split("");

        var i;
        for(i=0;i<brr.length;i++){
            if(brr[i]=="R"){
                red.push(i);
            }else if(brr[i]=="G"){
                green.push(i);
            }
        }


       while(red[red.length-1]>green[0]){
            var redpop;
            var greenshift;
            redpop=red.pop();
            greenshift=green.shift();
            red.push(greenshift);
            green.push(redpop);
            red.sort(compare);
            green.sort(compare);
            count=count+2;
  
       }
	return count;
    }



第三题  给四个整数 x1,k1,x2,k2, x1可以拼接k1次,x2可以拼接k2次,比较拼接后的两个数的大小,


第一个数拼接后比第二个数大,输出“Greater”,小则输出“Less”,相等则输出“Equal”;


样例输入  


1010  3  101010  2


输出  


Equal


其中 x1 取值可以去到10的9次方,普通的比大小肯定是行不通的。


我的思路是,把x1 和 x2 当成String来用,k1 和 k2 只是拼接次数罢了,


取String1 为 x1 拼接后的字符串, String2 为 x2拼接后的字符串,


将这两个字符串都转化成数组 xrr,yrr


1,比较数组长度,数组长的,数值大


2,数组长度相等的情况,遍历数组元素, 只要出现 xrr[i] >yrr[i] 的情况,输出”Greater“,小的情况输出”Less“,如果遍历完还是相等,

那就输出 ”Equal“;


注意在牛客网平台上,不是alert而是 print;我这里方便调试,都写成了alert;

贴上本地调试运行成功的代码(通过率100%)

    function equal(str){
        var arr=str.split(" ");
        x1=arr[0];
        k1=arr[1];
        x2=arr[2];
        k2=arr[3];
        var String1="";
        var String2="";
        for(var i=0;i<k1;i++){
            String1+=x1;
        }
        for(var j=0;j<k2;j++){
            String2+=x2;
        }
        
        var xrr=String1.split("");
        var yrr=String2.split("");
        len1=xrr.length;
        len2=yrr.length;
        if(len1>len2){
            alert("Greater");
        }else if(len1<len2)
        {
            alert("Less");
        }else if(len1==len2){
            for(var k=0;k<len1;k++){
                if(xrr[k]>yrr[k]) {
                    alert("Greater");
                    break;
                }else if(xrr[k]<yrr[k]){
                    alert("Less");
                    break;
                }
                if(k==len1-1)
                    alert("Equal");
            }
        }
    }

    str="1010 3 101010 2";
    equal(str);


就是这样,选择题做的不好,很多其他方面的知识,涉及纯前端的题目不是很多。


编程也不是考前端,感觉自己也没用什么算法,如果有更好的解法,或者对第二道题有想法的欢迎留言和我讨论!












评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值