1. RGB 到十六进制转换(RGB To Hex Conversion)
描述:
rgb 函数不完整。完成它,以便传入 RGB 十进制值将导致返回十六进制表示形式。RGB 的有效十进制值为 0 - 255。超出该范围的任何值都必须舍入到最接近的有效值。
注意:您的答案应始终为 6 个字符,3 个字符的速记在这里不起作用。
以下是预期输出值的示例:
rgb(255, 255, 255) // returns FFFFFF
rgb(255, 255, 300) // returns FFFFFF
rgb(0,0,0) // returns 000000
rgb(148, 0, 211) // returns 9400D3
解析
这题的思路是将接收的3个参数存入到数组中,再对数组遍历。因为接受的每个十进制数要转换成2位的十六进制数,所以十进制数最大不能大于255否则返回FF,最小不能小于0,否则返回0,这里使用两个判断,然后用toString(16)将数组中的十进制数转换成十六进制,因为返回的是大写的字符串所以我们用toUpperCase()将每个十六进制数转换成大写,对于不满足两位的十六进制数,用padStart()在首部进行填充'0'
代码
function rgb(r, g, b){
// complete this function
var arr = [r,g,b]
var str = ''
const x = 255
for(let i of arr) {
if(i <= 255 && i >= 0) {
i = i.toString(16)
}else if(i > 255){
i = x.toString(16)
}else{
i = '0'
}
str += i.toUpperCase().padStart(2,'0')
}
return str
}
2. 添加大数字(Adding Big Numbers)
描述
我们需要对大数字求和,我们需要你的帮助。
编写一个返回两个数字之和的函数。输入数字是字符串,函数必须返回字符串。
例:
add("123", "321"); -> "444"
add("11", "99"); -> "110"
注意: 输入数字很大, 输入是仅由数字组成的字符串,
解析
这题的主要问题在于数字可能会很大,所以我们不能只是简单的进行加法计算,否则计算结果溢出会丢失精度,造成输出的答案是错误的。 这里的思路是先获取较大数字的长度,然后将较短的字符首部补全0,然后进行计算。这里分别将每个相同位数上的数字进行加法计算,值得注意的是我们获得的参数是字符串,我们使用parseInt()将字符串转换成数字后进行加法运算,并且还要加上下一位数字的进位。这里使用Math.floor()获取数字的进位,最后用字符串拼接将每一位拼接起来。
代码
function add(a, b) {
const maxLen = Math.max(a.length,b.length)
a = a.padStart(maxLen,0)
b = b.padStart(maxLen,0)
var temp = 0
var flage = 0
var result = ''
for(let i = maxLen-1; i >= 0; i -- ) {
temp = parseInt(a[i]) + parseInt(b[i]) + flage;
flage = Math.floor(temp/10);
result = temp%10 + result
}
if(flage === 1){
result = '1' + result
}
return result
}
3.贪婪是好的(Greed is Good)
描述
Three 1's => 1000 points
Three 6's => 600 points
Three 5's => 500 points
Three 4's => 400 points
Three 3's => 300 points
Three 2's => 200 points
One 1 => 100 points
One 5 => 50 point
每个卷中只能计算一次单个骰子。例如,给定的“5”只能算作三元组的一部分(贡献 500 分)或单个 50 分,但不能在同一卷中同时算作两者。 评分示例:
Throw Score
--------- ------------------
5 1 3 4 1 250: 50 (for the 5) + 2 * 100 (for the 1s)
1 1 1 3 1 1100: 1000 (for three 1s) + 100 (for the other 1)
2 4 4 5 4 450: 400 (for three 4s) + 50 (for the 5)
在某些语言中,可以改变函数的输入。这是你永远不应该做的事情。如果更改输入,将无法通过所有测试。
解析
本题的主要思路是将每个点数掷出的个数存入数组,如果数组中对应点数出现的次数为3,则计入分数。题中的一点和五点是单次出现也计分,所以利用求余,将出现次数不不足或超出3次时,进行单独计分。
代码
function score( dice ) {
// Fill me in!
var arr = [0,0,0,0,0,0]
var points = 0
for(let i of dice){
switch(i) {
case 1:
arr[0] ++;
if(arr[0] == 3)
points = points + 1000;
break;
case 2:
arr[1] = arr[1] + 1;
if(arr[1] == 3)
points = points + 200;
break;
case 3:
arr[2] ++;
if(arr[2] == 3)
points = points + 300;
break;
case 4:
arr[3] ++;
if(arr[3] == 3)
points = points + 400;
break;
case 5:
arr[4] ++;
if(arr[4] == 3)
points = points + 500;
break;
case 6:
arr[5] ++;
if(arr[5] == 3)
points = points + 600;
break;
}
}
if (arr[0]%3 < 3) {
points += 100*(arr[0]%3)
}
if(arr[4]%3 < 3) {
points += 50*(arr[4]%3)
}
return points
}
4.大数的最后一位(Last digit of a large number)
描述
定义一个接受两个非负整数的函数一一个和b bb并返回最后一个十进制数字aba^b一个b.请注意,一一个和b bb可能非常大!
例如,最后一个十进制数字9^7是9因为9^7=4782969.最后一个十进制数字(2^200)^(2^300),其中已超过10^92十进制数字,是6.另外,请采取0^0要成为1.
您可以假设输入将始终有效。
例子:
lastDigit("4", "1") // returns 4
lastDigit("4", "2") // returns 6
lastDigit("9", "7") // returns 9
lastDigit("10","10000000000") // returns 0
解析
本题目的在于求出,a^b的各位上的数。所以本题的主要思路是只需要求出参数个位上的数字的b次方的值。并且在求出1~9中每个数字的b次方时,我们可以发现每当b=b+4时个位上的数字与b次方时相同,即当b>100时(因为nx100必为4的倍数),b百位及以上的数字可以忽略。所以我们可以只用b的末尾两位参与计算。这里利用一个循环,将每次与自己相乘的结果保留个位,然后参与下一次计算。当然当b=0时,结果必为1,但是我们计算时只用了最后两位所以必须考虑b=nx100时的情况,如果b最高位也为零则输出1
代码
var lastDigit = function(str1, str2){
var str1 = parseInt(str1[str1.length-1])
var str = parseInt(str2[0])
var str2 = parseInt(str2.slice(str2.length-2))
var x = str1
for(let i = 0; i < str2-1; i ++) {
x = (x * str1) % 10
}
if(str2 == 0 && str == 0) {
x = 1
}
return x
}
5.人类可读的持续时间格式(Human readable duration format)
描述
为了完成这个 Kata,你的任务是编写一个函数,该函数以人性化的方式格式化持续时间,以秒数给出。
该函数必须接受非负整数。如果为零,则仅返回“now”。否则,持续时间表示为年、天、小时、分钟和秒的组合。
通过一个例子更容易理解:
* For seconds = 62, your function should return
"1 minute and 2 seconds"
* For seconds = 3662, your function should return
"1 hour, 1 minute and 2 seconds"
就此卡塔而言,一年是 365 天,一天是 24 小时。
请注意,空格很重要。
详细规则 生成的表达式由 4 秒、1 年等组件组成。通常,正整数和有效时间单位之一,用空格分隔。如果整数大于 1,则以复数形式使用时间单位。
组件由逗号和空格 “, ” 分隔。除了最后一个组件,它用“and”分隔,就像用英语写一样。
描述
这个题目相当讨厌,计算时间并不难,这题的大部分时间我都耗在相当繁琐的字符拼接过程中。 主要思路是,将参数按照年、日、时、分、秒的顺序进行计算,每次计算完将计算掉的部分减去,可以方便后面部分的计算。每次计算完都要进行一次判断,如果值不为一则拼接字符串的单位就要用对应的单复数,然后就是每一次计算时,都要判断高位的时间值受否有,及字符串是否拼接过,如果拼接过就加','。其次就是最后两个时间之间要用'and',这里用的是判断计算过后,是否还有不为0的值,即是否还有时间没有计算,如果没有了就不接','而接'and'。
代码
function formatDuration (seconds) {
// Complete this function
var time = ''
var year = Math.floor(seconds/31536000)
if(year > 0){
seconds = seconds - (year*31536000)
if (year == 1) {
time = time + year + ' ' + 'year'
}else{
time = time + year + ' ' + 'years'
}
}
var day = Math.floor(seconds/86400)
if(day > 0){
seconds = seconds - (day*86400)
if(time.length > 0) {
if(seconds != 0) {
time = time + ',' + ' '
}else {
time = time +' ' + 'and' + ' '
}
}
if(day == 1) {
time = time + day + ' ' + 'day'
}else {
time = time + day + ' ' + 'days'
}
}
var hour = Math.floor(seconds/3600)
if(hour > 0){
seconds = seconds - (hour*3600)
if(time.length > 0) {
if(seconds != 0) {
time = time + ',' + ' '
}else {
time = time +' ' + 'and' + ' '
}
}
if(hour == 1) {
time = time + hour + ' ' + 'hour'
}else {
time = time + hour + ' ' + 'hours'
}
}
var minute = Math.floor(seconds/60)
if(minute > 0) {
seconds = seconds-(minute*60)
if(time.length > 0) {
if(seconds != 0) {
time = time + ',' + ' '
}else {
time = time +' ' + 'and' + ' '
}
}
if(minute == 1) {
time = time + minute + ' ' + 'minute'
}else {
time = time + minute + ' ' + 'minutes'
}
}
var second = seconds
if (time.length > 0 && second > 0) {
time = time +' ' + 'and' + ' '
}
if(second == 1) {
time = time + second + ' ' + 'second'
}else if(second > 1 ) {
time = time + second + ' ' + 'seconds'
}
if(time.length == 0) {
time = 'now'
}
return time
}