程序员必做50道题
Posted maibao666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序员必做50道题相关的知识,希望对你有一定的参考价值。
JS程序员必做50道题及其答案
//1.由4个数字 1,2,3,4,可以组成多少个互不相同的三位数
var str=‘‘;
for(var i=1;i<=4;i++)
{
for(var j=1;j<=4;j++)
{
for(var k=1;k<=4;k++)
{
if (!(i==j==k))
{
var a=i.toString(),b=j.toString(),c=k.toString();
str=a+b+c;
console.log(str);
}
}
}
}
//1.由四个不同的数字组成,比如 1,5,7,8
var str=‘‘;
var count=0;
var array=[1,5,7,8]
for(var i=0;i<4;i++)
{
for(var j=0;j<4;j++)
{
for(var k=0;k<4;k++)
{
if ((array[i]!=array[j])&&(array[j]!=array[k])&&(array[i]!=array[k]))
{
count+=1;
var a=array[i].toString(),b=array[j].toString(),c=array[k].toString();
str=a+b+c;
console.log(str);
}
}
}
}
console.log(‘总共有‘+count+‘个不同的三位数‘);
//3 一个整数加上100是完全平方数,加上168又是一个完全平方数
for(i=0;i<1000;i++)
{
var x=parseInt(Math.sqrt(a+100));
var y=parseInt(Math.sqrt(a+168));
if((x*x==(a+100))&&(y*y==(a+168))
{
console.log(a);
}
}
//4 输入某年某月某日,判断这一天是一年当中的第几天
var year=2100 ,month=3,day=10;
var monthArray1=[31,29,31,30,31,30,31,31,30,31,30,31];
var monthArray2=[31,28,31,30,31,30,31,31,30,31,30,31];
var result=0;
if (((year%4==0 && year%100!=0)|| year%400==0))
{
for(var i=0;i<month-1;i++)
{
result += monthArray1[i];
}
var newResult=result+day;
console.log(year +‘-‘+ month +‘-‘ +day +‘闰年的第‘+ newResult + ‘天‘);
}
else
{
for(var i=0;i<month-1;i++)
{
result += monthArray2[i];
}
var newResult=result+day;
console.log(year+‘-‘+ month +‘-‘+day +‘一年的第‘+ newResult + ‘天‘);
}
//5 输入三个数,把三个数按照从小到大排列输出
var a=3,b=4,c=1;
if(a>b)
{
var max1=a;
a=b;
b=max1;
}
console.log(a,b,c);
if(c<b)
{
var max2=b;
b=c;
c=max2;
}
console.log(a,b,c);
if(a>b)
{
var max3=a;
a=b;
b=max3;
}
console.log(a,b,c);
// 6 用*输出C字型的图案
var str=‘‘;
str+=‘ ‘+‘*‘+‘*‘;
str+=‘
‘;
str+=‘*‘;
str+=‘
‘;
str+=‘*‘;
str+=‘
‘;
str+=‘ ‘+‘*‘+‘*‘;
console.log(str);
//7.将一个正整数分解质因数,例如输入90,打印出90=2*3*3*5
function primeCheck(n)
{
for(var i=2;i<n;i++)
{
if(n%i==0)
{
return false;
}
}
return true; //判断是不是质数
}
function prime(k)
{
var str=‘‘;
for(var t=2;t<k;t++)
{
if(k%t==0) //先遍历,看看能不能整除
{
if(primeCheck(t)) //再判断是不是质数
{
str+=t+‘*‘;
k/=t;
t=1; //让t从2开始循环
}
}
}
str+=k //最后一个必然是质数,必然不会被小于它的数整除
return str;
}
var a=prime(100);
console.log(a);
//8.输出9 9乘法表
for (var i=1;i<10 ;i++ )
{
var line=‘‘;
for(var j=1;j<=i;j++)
{
line += i+‘*‘+j+‘=‘+i*j +‘
‘;
}
console.log(line);
}
//9.输出国际象棋
//10.古典问题:有一对兔子, 从出生后第 3个月起每个月都生一对兔子, 小兔子长到第三 个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
fibonaci数列
1.用递归的方法写
function fibonaci(n)
{
if(n<=2)
{
return 1
}
return fibonaci(n-1)+fibonaci(n-2);
}
console.log(fibonaci(6));
2.不用递归的方法写
function fibonaci(n)
{ var fibonaci1=1,fibonaci2=1;fib=0;
if(n<=2)
{return 1;}
for(i=3;i<=n;i++)
{ fib=fibonaci1+fibonaci2;
fibonaci1=fibonaci2;
fibonaci2=fib;
}
return fib;
}
console.log(fibonaci(100));
//判断101到200有多少个素数,并且输出
function primeCheck(n)
{
for(var i=2;i<Math.sqrt(n);i++)
{
if(n%i==0)
{
return false;
}
}
return true;
}
for(var k=101;k<201;k++)
{
var isPrime=primeCheck(k);
if(isPrime)
{
console.log(k);
}
}
//11.打印出所有的 “ 水仙花数 ” ,所谓 “ 水仙花数 ” 是指一个三位数,其各位数字立方和等于 该数本身。
例如:153是一个 “ 水仙花数 ” ,因为 153=1的三次方+5的三次方+3的三次方。
(1)
方法一 for(var a=1;a<10;a++){
for(var b=0;b<10;b++){
for(var c=0;c<10;c++){
if(a*a*a+b*b*b+c*c*c==a*100+b*10+c)
{
console.log(a*100+b*10+c);
}
}}}
方法二 for(var i=101;i<1000;i++)
{
var bai=parseInt(i/100);
var shi=parseInt((i%100)/10);
var ge=(i%100)%10;
if(bai*bai*bai+shi*shi*shi+ge*ge*ge==i)
{ console.log(i)}
}
方法三 将输入的三位数变成字符串,然后将字符串的每一个位取出组成一个数组
for(var i=101;i<1000;i++)
{
var a=i.toString();
var b=a.split(‘‘);
if(b[0]*b[0]*b[0]+b[1]*b[1]*b[1]+b[2]*b[2]*b[2]==i)
{
console.log(i);
}
}
//12 判断 101-200之间有多少个素数,并输出所有素数。
function primeCheck(n)
{
for(var i=2;i<Math.sqrt(n);i++)
{
if(n%i==0)
{
return false;
}
}
return true;
}
for(var k=101,count=0;k<201;k++)
{
var isPrime=primeCheck(k);
if(isPrime)
{
count++
console.log(k);
}
}
console.log(count);
//13 利用条件运算符的嵌套来完成此题:学习成绩 >=90分的同学用 A 表示, 60-89分之 间的用 B 表示, 6 0分以下的用 C 表示。
var great=92;
great>=60? (great>=90? console.log(‘A‘): console.log(‘B‘)):console.log(‘C‘);
//14 输入两个正整数 m 和 n ,求其最大公约数和最小公倍数。
function maxYue(a,b)
{ var n=0;
var array=[];
a<b? n=a: n=b;
for(i=2;i<n;i++)
{
if (a%i==0 && b%i==0)
{
array.push(i);
}
} // 把a 和 b 的公约数都放在一个数组里面
var max_yue=array[0];
for(var t=1;t<array.length;t++)
{
if(max_yue<array[t])
{
max_yue=array[t];
}
} //求出这个公约数数组的最大的那一个就是最大公约数
return max_yue;
}
function getBei(a,b)
{
for(var i=2;i>=2;i++)
{
var bei1=i*a;
if((bei1%b==0)&&(bei1!=b)) //加后面的与是为了避免第一个数的倍数等于第二个数
{
return bei1;
}
}
}
console.log(‘最大公约数是‘+maxYue(15,30));
console.log(‘最小公倍数是‘+getBei(15,30));
15.输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
var str1=‘abc123 &-b‘;
var b=str1.split(‘‘);
for(var i=0,count1=0,count2=0,count3=0;i<b.length;i++)
{ if(b[i]===‘ ‘)
{
count1++; //代表空格的个数
}
var str2=Number(b[i]); //Number转换带有非数字的字符会返回Nan
if( isNaN(str2)) //如果是NAN,就代表非数字的字符
{
count2++; //代表字母和其他字符的个数之和
if( (b[i]>=‘a‘&&b[i]<=‘z‘)||(b[i]>=‘A‘&&b[i]<=‘Z‘)) //判断非数字的字符里面的属于字母的字符
{
count3++; //代表字母的个数
}
}
}
var count4=count2-count3 //代表除字母外的其他非数字字符的个数
var count5=b.length-count1-count2;
console.log(count1,count3,count4,count5);
//方法二:用正则判断
var reg1=/d/g;
var reg2=/s/g;
var reg3=/[A-Za-z]/g;
var len1=str.match(reg1).length;//返回数字的个数
var len2=str.match(reg2).length;//返回空格的个数
var len3=str.match(reg3).length;返回字母的个数
//16.求 s=a+aa+aaa+aaaa+aa...a的值,其中 a 是一个数字。例如 2+22+222+2222+22222(此 时共有 5个数相加 )
,几个数相加有键盘控制。
方法一:将每一位相加,然后用字符串拼接
function fn(a,n)
{ var array=[];
var str=‘‘
for(var i=n,num=0,jinwei=0;i>0;i--)
{
num=(a*i)%10+jinwei; //先从个位开始 得到该位的数
jinwei=parseInt((a*i)/10);//计算进位
// str+=num;
array.push(num); //放到数组里面去
}
for(var i=array.length-1;i>=0;i--) //数组逆序遍历
{
str+=array[i]; //将数组中的元素拼接到字符串里面去
}
return str; //返回字符串
}
console.log(fn(2,5));
方法二:从个位开始到最高位,依次开始加权相加
//17一个数如果恰好等于它的因子之和, 这个数就称为 “ 完数 ” 。 例如 6=1+2+3. 编程找出1000以内的所有完数。
function wanshu(k)
{
for(var i=1,str=‘‘;i<k;i++) //外层表示K以内任何的数
{
for(var b=1,array=[];b<i;b++) //内层表示寻找K以内某个数的质因子
{
if(i%b==0) //找出该数的所有因子
{
array.push(b);
}
}
for (var t=0,sum=0;t<array.length;t++ ) //遍历数组,将数组中的所有元素相加
{
sum+=array[t];
}
if(sum==i)
{
str+=i+‘ ‘;
}
}
return str;
}
console.log(wanshu(1000));
//18 一球从 100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第 10次落地时,共经过多少米?第 10次反弹多高?
function getHigh(h,n)
{
for(var i=1,sum=0;i<=n;i++)
{
sum+=h+h/2;
h/=2
}
return sum;
}
function high(h,n)
{
for(var i=1;i<=n;i++)
{
h/=2;
}
return h;
}
console.log(getHigh(100,12));
console.log(high(100,12));
//19 :猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半, 又多吃了一个。
以后每天早上都吃了前一天剩下的一 半零一个。到第 10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
function taozi(i)
{
var leave=1;
do
{ leave=(leave+1)*2;
i--
}
while (i>=1);
return leave;
}
console.log(taozi(9));
//20 两个乒乓球队进行比赛,各出三人。甲队为 a,b,c 三人,乙队为 x,y,z 三人。已抽签决 定比赛名单。
有人向队员打听比赛的名单。 a 说他不和 x 比, c 说他不和 x,z 比,请编程序 找出三队赛手的名单。
//21有一分数序列:2/1, 3/2, 5/3, 8/5, 13/8, 21/13...求出这个数列的前 20项之和。
var fib1=2,fib2=3,fib=0,i=3; //分子
var afib1=1,afib2=2,afib=0; //分母
var sum1=fib1+fib2;
var sum2=afib1+afib2;
do
{
fib=fib1+fib2;
fib1=fib2;
fib2=fib; //分子是fibonaci 数列 前20项相加
sum1+=fib;
afib=afib1+afib2;
afib1=afib2; //分母也是fibonaci 数列 前20项相加
afib2=afib;
sum2+=afib;
i++;
}
while (i<21);
var total=sum1/sum2;
console.log(total);
//22 求 1+2!+3!+...+20!的和
function jc(k)
{ if(k<=1)
{
return 1;
}
return k*jc(k-1);
}
function add(n)
{ var sum =0;
for(var i=1;i<=n;i++)
{
sum+=jc(i);
}
return sum;
}
var a=add(20);
console.log(a);
//23利用递归方法求 5! 。
function jc(k)
{ if(k<=1)
{
return 1;
}
return k*jc(k-1);
}
console.log(jc(5));
//24利用递归函数调用方式,将所输入的 5个字符,以相反顺序打印出来。
var str1=‘abcde‘;
var b=str1.split(‘‘);
var str=‘‘;
function nixu(i)
{
if(i==0)
{
return b[0];
}
return str+=b[i]+nixu(i-1)
}
console.log(nixu(4));
//25 有 5个人坐在一起,问第五个人多少岁?他说比第 4个人大 2岁。问第 4个人岁数,
他说比第 3个人大 2岁。 问第三个人,又说比第 2人大两岁。 问第 2个人, 说比第一个人大 两岁。
最后问第一个人,他说是 10岁。请问第五个人多大?
var age=0;
function age(i)
{
if(i==1)
{
return 10;
}
return age=age(i-1)+2;
}
console.log(age(5));
// 26 给一个不多于 5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
var a=12345;
function panduan (k)
{ var c=k.toString();
var b=c.split(‘‘);
var str=‘‘,str1=‘‘;
switch(b.length)
{
case 1: str=‘这是一个一位数‘;break;
case 2: str=‘这是一个两位数‘;break;
case 3: str=‘这是一个三位数‘;break;
case 4: str=‘这是一个四位数‘;break;
case 5: str=‘这是一个五位数‘;break;
default:str=‘输入错误‘;
}
for(var i=b.length-1;i>=0;i--)
{
str1+=b[i];
}
return str+‘ ‘+str1;
}
console.log(panduan(a));
//27 一个 5位数,判断它是不是回文数。即 12321是回文数,个位与万位相同,十位与千 位相同
var a=12321;
function panduan (k)
{ var c=k.toString();
var b=c.split(‘‘);
if(b[0]==b[4]&&b[1]==b[3])
{
return ‘这是一个回文数‘;
}
else
{
return ‘这不是一个回文数‘;
}
}
console.log(panduan(a));
//方法一 遍历数组得到
function nixu(arr)
{ var newArr=[];
for(var i=0;i<arr.length;i++)
{
newArr[i]=arr[arr.length-1-i];
}
return newArr;
}
console.log(nixu([1,3,4,9]));
//方法二 递归输出
var str=‘‘;
var a=[1,2,3,4];
function nixu(i)
{
if(i==0)
{
return str+=a[0];
}
return str+=a[i]+nixu(i-1)
}
console.log(nixu(3).split(‘‘));
//28请输入星期几的第一个字母来判断一下是星期几, 如果第一个字母一样, 则继续判断 第二个字母。
while(true)
{
var a=prompt(‘please input the first char‘);
if(a==‘m‘){alert(‘星期一‘);}
else if(a==‘w‘){alert(‘星期三‘);}
else if(a==‘f‘){alert(‘星期五‘);}
else if(a==‘t‘){a=prompt(‘please input the second char‘);
if(a==‘u‘){alert(‘星期二‘);}
if(a==‘h‘){alert(‘星期四‘);}}
else if(a==‘s‘){a=prompt(‘please input the second char‘);
if(a==‘a‘){alert(‘星期六‘);}
if(a==‘u‘){alert(‘星期日‘);}}
else
alert(‘wrong input!‘);
}
//29 对 10个数进行排序
/*function exchange(str)
{
for(var i=0;i<str.length-1;i++)
{
for(var j=0;j<str.length-1-i;j++)
{
if(str[j]>str[j+1])
{
var swap=str[j];
str[j]=str[j+1];
str[j+1]=swap;
}
}
}
}
inputStr=[1,4,2,5,11];
console.log(‘排序之前的数组‘ + inputStr);
exchange(inputStr);
console.log(‘排序之后的数组‘ + inputStr);
//30 求一个 3*3矩阵对角线元素之和
//31 有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
//32 将一个数组逆序输出。
//方法一 遍历数组得到
function nixu(arr)
{ var newArr=[];
for(var i=0;i<arr.length;i++)
{
newArr[i]=arr[arr.length-1-i];
}
return newArr;
}
console.log(nixu([1,3,4,9]));
//方法二 递归输出
var str=‘‘;
var a=[1,2,3,4];
function nixu(i)
{
if(i==0)
{
return str+=a[0];
}
return str+=a[i]+nixu(i-1)
}
console.log(nixu(3).split(‘‘));
方法三:用数组的API reverse()
//附加题:在一定范围内产生随机数
function getRandomNum(min,max)
{
var range=max-min;
var rand=Math.random();
return (min+Math.floor(rand*range))
}
console.log(getRandomNum(10,34)); 会随机打印出在10到34之间的数
//附加题:福利彩票双色球
function getRandomNum(min,max)
{
var range=max-min;
var rand=Math.random();
return min+Math.floor(rand*range); //产生0到32的下标
}
var arrRedRandom=[];
var arrRed=[‘01‘,‘02‘,‘03‘,‘04‘,‘05‘,‘06‘,‘07‘,‘08‘,‘09‘,10, //红色球号码
11,12,13,14,15,16,17,
18,19,20,21,22,23,24,
25,26,27,28,29,30,31,32,33];
var arrBlue=[‘01‘,‘02‘,‘03‘,‘03‘,‘04‘,‘05‘,‘06‘,‘07‘,‘08‘,‘09‘,10,11,12,13,14,15,16];
for(var i=0;i<6;i++)
{
var index=getRandomNum(0,arrRed.length); //随机产生下标
arrRedRandom.push(arrRed[index]); //向数组中插入该下标的数组元素
arrRed.splice(index,1); //插入这个数后,就把数组库里的这个元素删除掉,以免下次随机产生的时候重复
}
console.log(‘红色双号球的号码:‘+‘ ‘+arrRedRandom);
var index1=getRandomNum(0,arrBlue.length);
var str=arrBlue[index1];
console.log(‘蓝色单号球的号码:‘+‘ ‘+str)
var redAddBlue=arrRedRandom.concat(Number(str));
console.log(redAddBlue)
33.打印出杨辉三角形(要求打印出 10行如下图)
34 输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组
var str=[1,2,0,5,6,2]
for(var i=1, temp=0;i<str.length;i++) //假设第一个数是最大的,和后面的数两两比较,如果大于第一个数,就交换
{
if(str[0]<str[i])
{
temp=str[0]
str[0]=str[i]
str[i]=temp
}
}
for(var i=str.length-2,temp=0;i>=0;i--) //假设最后一个数是最大的,和前面的数两两比较,如果小于第一个数,就交换
{
if(str[str.length-1]>str[i])
{
temp=str[str.length-1];
str[str.length-1]=str[i]
str[i]=temp;
}
}
console.log(str);
var str=[1,2,0,5,6,2]
for(var i=1,j=str.length-2 ,temp1=0,temp2=0;i<str.length,j>=0;i++,j--) //两个for写在一起
{
if(str[0]<str[i])
{
temp1=str[0]
str[0]=str[i]
str[i]=temp1
}
if(str[str.length-1]>str[j])
{
temp2=str[str.length-1];
str[str.length-1]=str[j]
str[j]=temp2;
}
}
console.log(str)
36//有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1到 3报数) ,凡报到 3的 人退出圈子,问最后留下的是原来第几号的那位。
var n=10
var str=‘留下人的数字号码是:‘
var i=1;
do
{ if(i%3!=0)
{
str+=‘ ‘+i;
}
i++;
}
while (i<=n);
console.log(str);
37:写一个函数,求一个字符串的长度,在 main 函数中输入字符串,并输出其长度。
38:编写一个函数,输入 n 为偶数时,调用函数求 1/2+1/4+...+1/n,当输入 n 为奇数时,调 用函数 1/1+1/3+...+1/n
function addDouble(n)
{
var sum=0;
var i=2;
do
{
sum+=(1/i)
i+=2
}
while (i<=n);
return sum;
}
function addinDouble(n)
{
var sum=0;
var i=1;
do
{
sum+=(1/i)
i+=2
}
while (i<=n);
return sum;
}
var n=10;
n%2==0&&console.log(addDouble(n))
n%2!=0&&console.log(addinDouble(n))
39:海滩上有一堆桃子, 五只猴子来分。 第一只猴子把这堆桃子凭据分为五份, 多了一个, 这只猴子把多的一个扔入海中,
拿走了一份。 第二只猴子把剩下的桃子又平均分成五份, 又 多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、
第五只猴子都是这样做 的,问海滩上原来最少有多少个桃子?
43//一个偶数总能表示为两个素数之和。
function isPrime(k) //判断是不是素数
{
for(var i=2;i<k;i++)
{
if(k%i==0)
{
return false
}
}
return true
}
function isDoubleNum(t) //判断是不是偶数
{
if(t%2!=0)
{
return false
}
else
{
return true
}
}
function anyDoubleNum(n) //先找小于该数的素数,用该数减去该素数,载判断剩下的是不是素数,一旦是的话,就return
{
if(isDoubleNum(n))
{
for(var i=2;i<n;i++)
{
if(isPrime(i))
{
var k=n-i;
if(isPrime(k)&&k>=2)
{
console.log(n,i,k)
return ;
}
}
}
}
}
anyDoubleNum(4);//调用函数
//附加题 将字符串的首字母变成大写字母
var str1=‘miao-wei-ke-tang‘
function strToUpperCase(str)
{
var arr=str.split(‘-‘)
for(var i=0;i<arr.length;i++)
{
arr[i]=arr[i].substr(0,1).toUpperCase()+arr[i].substr(1)
}
var res=arr.join(‘‘)
return res;
}
console.log(strToUpperCase(str1))
//附加题:去掉字符串中前后的空格
var str1=‘ abc d ‘
function myTrilm(str)
{
var start=0; //
var end=str.length-1;
while(!str.charAt(start)&&!str.charAt(start+1))
{
start++;
}
while(!str.charAt(end)&&!str.charAt(end-1))
{
end--;
}
var newStr=str.slice((start+1),end)
return newStr;
}
console.log(str1)
console.log(myTrilm(str1))
//附加题 写一个方法,找出字符串‘abcabcabcabda’中ab出现的次数和位置
function getCountandLocation(str)
{ var count=0;
var locate=[];
for(var i=0;i<str.length;i++)
{
if((str.charAt(i)==‘a‘)&&(str.charAt(i+1)==‘b‘))
{
count++;
locate.push(i+1);
}
}
var res=locate.concat(count)
return res;
}
console.log(getCountandLocation())
//判断是函数 数组 对象的几种方法
var arr=[1,2];
function fun(){}
var obj={};
console.log(arr instanceof Array);
console.log(obj instanceof Object);
console.log([].constructor == Array); //true
console.log({}.constructor == Object); //true
console.log("string".constructor == String); //true
console.log((123).constructor == Number); //true
console.log(true.constructor == Boolean); //true
function isArray(o) {
return Object.prototype.toString.call(o);
}
var arr=[2,5,6,8];
var obj={name:‘zhangsan‘,age:25};
var fn = function () {}
console.log(isArray(arr)); //[object Array]
console.log(isArray(obj)); //[object Object]
console.log(isArray(fn)); //[object function]
//随机生成10-100的10个数字,并且升序排列。
function getArr(min,max,len)
{
var arr=[]; //写一个空数组来接收产生的随机数
var range=max-len+1;
for(var i=0;i<=len-1;i++)
{
var a=Math.floor(Math.random()*range+min);//随机生成10-100
if(arr.indexOf(a)==-1)//如果该数组中的没有该数就将数放进数组中
{
arr.push(a);
}
else{//如果该数组中有这个数字,就重新循环一次生成随机数
i--;
}
}
arr.sort(function(a,b){return a-b;})
return arr;
}
console.log(getArr(10,100,10));
以上是关于程序员必做50道题的主要内容,如果未能解决你的问题,请参考以下文章
Python修行中必做练手项目,为你的Python神功打下坚实基础!