JS在线编程

来源:互联网 发布:linux rm最酷的命令 编辑:程序博客网 时间:2024/05/16 12:28
1、[编程题] 优雅的点
小易有一个圆心在坐标原点的圆,小易知道圆的半径的平方。小易认为在圆上的点而且横纵坐标都是整数的点是优雅的,小易现在想寻找一个算法计算出优雅的点的个数,请你来帮帮他。
例如:半径的平方如果为25
优雅的点就有:(+/-3, +/-4), (+/-4, +/-3), (0, +/-5) (+/-5, 0),一共12个点。 
输入描述:
输入为一个整数,即为圆半径的平方,范围在32位int范围内。
输出描述:
输出为一个整数,即为优雅的点的个数
输入例子1:
25
输出例子1:
12
代码:
function getPoints(n){    if(n<=0){        return 0;    }    var count=0;    var r=Math.sqrt(n);    for(var x=1;x<r;x++){        for(var y=1;y<r;y++){            if(x*x+y*y==n){                count=count+4;            }        }    }    if(x==r){        count=count+2;    }    if(y==r){        count=count+2;    }    return count;}


2、[编程题] 数字翻转
对于一个整数X,定义操作rev(X)为将X按数位翻转过来,并且去除掉前导0。例如:
如果 X = 123,则rev(X) = 321;
如果 X = 100,则rev(X) = 1.
现在给出整数x和y,要求rev(rev(x) + rev(y))为多少? 
输入描述:
输入为一行,x、y(1 ≤ x、y ≤ 1000),以空格隔开。
输出描述:
输出rev(rev(x) + rev(y))的值
输入例子1:
123 100
输出例子1:
223
代码:
function getRevSum(str){    var x=str.split(' ')[0];    var y=str.split(' ')[1];    return rev((rev(x)+rev(y)).toString());}function rev(n){    var r=n.split('').reverse().join('');    return parseInt(r);}


3、[编程题] 最大的奇约数
小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11.
现在给出一个N,需要求出 f(1) + f(2) + f(3).......f(N)
例如:N = 7
f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3 + 7 = 21
小易计算这个问题遇到了困难,需要你来设计一个算法帮助他。 
输入描述:
输入一个整数N (1 ≤ N ≤ 1000000000)
输出描述:
输出一个整数,即为f(1) + f(2) + f(3).......f(N)
输入例子1:
7
输出例子1:
21
代码:
function f(n){if (n%2==1) {return n;}var m=n-1;while (m!=1) {if (n%m==0&&m%2==1) {return m;}m--;}return 1;}function getMaxSum(N){if (N==1) {return 1;}var sum=0;for(var i=1;i<=N;i++){sum+=f(i);}return sum;}console.log(getMaxSum(7));


4、[编程题] 买苹果
小易去附近的商店买苹果,奸诈的商贩使用了捆绑交易,只提供6个每袋和8个每袋的包装(包装不可拆分)。 可是小易现在只想购买恰好n个苹果,小易想购买尽量少的袋数方便携带。如果不能购买恰好n个苹果,小易将不会购买。 
输入描述:
输入一个整数n,表示小易想购买n(1 ≤ n ≤ 100)个苹果
输出描述:
输出一个整数表示最少需要购买的袋数,如果不能买恰好n个苹果则输出-1
输入例子1:
20
输出例子1:
3
代码:
function getApple(n){if (n<6) {return -1;}if (n==6||n==8) {return 1;}var min=n;for(var i=0;i<n;i++){for(var j=0;j<n;j++){if ((6*i+8*j==n)&&min>(i+j)) {min=i+j;}}}if (min==n) {return -1;}return min;}console.log(getApple(20))


5、[编程题] 回文序列
如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, 
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。
现在给出一个数字序列,允许使用一种转换操作:
选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。
现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列。
输入描述:
输入为两行,第一行为序列长度n ( 1 ≤ n ≤ 50)
第二行为序列中的n个整数item[i]  (1 ≤ iteam[i] ≤ 1000),以空格分隔。
输出描述:
输出一个数,表示最少需要的转换次数
输入例子1:
4
1 1 1 3
输出例子1:
2
代码:
//读取数据,将输入数据按行存到数组中,操作数组arrfunction geRevStr(arr){    var len = parseInt(arr[0]);    var arrs = arr[1].split(" ");    var count = 0;    while(len > 1){        if(parseInt(arrs[0]) === parseInt(arrs[len-1])){            arrs.pop();            arrs.shift();            len -= 2;        }else if(parseInt(arrs[0]) > parseInt(arrs[len - 1])){            var a = parseInt(arrs.pop());            var b = parseInt(arrs.pop());            arrs.push(a + b);            len -= 1;            count++;        }else{        var a = parseInt(arrs.shift());        var b = parseInt(arrs.shift());        arrs.unshift(a + b);        len -= 1;        count++;       }    }    console.log(count);}


6、二维数组中的查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
答案:
function Find(target, array){   var len1=array.length;   var len2=array[0].length;   for(var i = len1-1; i >=0; i--){    for(var j = 0; j <len2; j++){    if (array[i][j]>target) {    break;    }else if (array[i][j]<target) {    continue;    }else{    return true;    }    }     }    return false;}


思路:从左下角开始查找。target大于当前值,j++(右移),target小于当前值,i--(上移),target等于当前值,返回true;循环结束没找到没查找到返回false
原创粉丝点击