爱奇艺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);
就是这样,选择题做的不好,很多其他方面的知识,涉及纯前端的题目不是很多。
编程也不是考前端,感觉自己也没用什么算法,如果有更好的解法,或者对第二道题有想法的欢迎留言和我讨论!