JS | 教练,我想做习题4

坚强是说给别人听的谎言 提交于 2021-01-28 22:10:12

🚀 前言

大家好呀,我是毛小悠,可以叫我二毛,在家中排行老二,是一名前端开发工程师。

本系列文章旨在通过练习来提高JavaScript的能力,一起愉快的做题吧。😀😀😀

以下每道题,二毛我都有尝试做一遍。建议限时训练,比如限定为半小时,如果半小时内想不出来,可以结合文章末尾的参考答案来思考。

可以在下方评论区留言或者加我的微信:code_maomao。期待你的到来。

求关注求点赞👍~~~😘😘😘

📖 题目1:连续重复次数最长的字符

对于给定的字符串s找到连续重复次数最长的字符c(或C),然后返回:

[c, l]

其中l(或L)是重复的长度。如果有两个或更多个相同的字符l,则按出现的顺序返回第一个。

对于空字符串返回:

["", 0]

祝您编码愉快!:)

习题代码:

function longestRepetition(s) {
}

📖 题目2:Detect Pangram

七巧板是包含至少一个字母的每个字母的句子。 例如,句子“快速的棕色狐狸跳过懒惰的狗” "The quick brown fox jumps over the lazy dog"是一个连字符,因为它至少一次使用字母A-Z(大小写无关)。

给定一个字符串,检测它是否是一个七巧板。 如果是,则返回True,否则返回False。 忽略数字和标点符号。

也就是说a-z每个字母都使用过至少一次,就返回true。

function isPangram(string){
  //...
}

📖 题目3:如果元素出现n次以上,则删除该元素的出现

适可而止!

爱丽丝和鲍勃在度假。他们俩都为去过的地方拍了很多照片,现在他们想向Charlie展示他们的整个照片。但是,Charlie不喜欢这些,因为照片通常会重复。他不喜欢见埃菲尔铁塔40次。他告诉他们,只有在他们最多显示不超过N次相同的照片时,他才会想看。幸运的是,爱丽丝和鲍勃能够将动机编码为数字。您能否帮助他们删除数字,以使他们的列表最多包含N次而不更改顺序?

任务

给定一个列表lst和一个数字N,创建一个新列表,其中最多包含N次每个lst数,而无需重新排序。例如,如果N = 2,并且输入为[1,2,3,1,2,1,2,3],则取[1,2,3,1,2],删除下一个[1,2 ],因为这将导致1和2在结果中出现3次,然后取3,从而得出[1,2,3,1,2,3]。

  deleteNth ([1,1,1,1],2) // return [1,1]

  deleteNth ([20,37,20,21],1) // return [20,37,21]

习题代码

function deleteNth(arr,n){
  // ...
}

📖 题目4:重复编码器

本练习的目的是将字符串转换为新字符串,其中新字符串中的每个字符是"("该字符在原始字符串中仅出现一次,还是")"该字符在原始字符串中出现多次。确定字符是否重复时忽略大写。

例子

"din"      =>  "((("
"recede"   =>  "()()()"
"Success"  =>  ")())())"
"(( @"     =>  "))((" 

习题代码

function duplicateEncode(word){
    // ...
}

答案

🍗 题目1的答案

function longestRepetition(s) {
  let count = 0;
  let prevLetter = '';
  
  return s.toLowerCase().split('').reduce((acc, curr) => {
    if(curr === prevLetter){
      count++;
    }
    else{
      count = 1;
    }

    if(count > acc[1]){
      acc[1] = count;
      acc[0] = curr;
    }

    prevLetter = curr;
    return acc;
  }, ['', 0]);
}

参考答案2

const longestRepetition = s => s ?
  s.match(/(.)\1*/g)
    .map((s, i) => [s[0], s.length, i])
    .sort((a, b) => (b[1] - a[1]) || (a[2] - b[2]))[0]
    .splice(0, 2) :
  ['', 0];

🍗 题目2的答案

二毛解题思路:先去除和字母无关的字符。然后给数组排序和去重,然后判断数组的长度是否是26。

参考答案1:

function isPangram(string){
  string = string.toLowerCase();
  return "abcdefghijklmnopqrstuvwxyz".split("").every(function(x){
    return string.indexOf(x) !== -1;
  });
}

参考答案2:

function isPangram(string){
  return 'abcdefghijklmnopqrstuvwxyz'
    .split('')
    .every((x) => string.toLowerCase().includes(x));
}

参考答案3:

function isPangram(string){ 

参考答案4:

function isPangram(string) {
	/* 思路:去除和字母无关的字符。然后给数组排序和去重,然后判断数组的长度是否有26。 */
	console.log("string:",string);
	var arr=string.toLowerCase().split("").filter(function(v){
		if(v.search(/[A-z]/)!=-1){
			return true;
		}
	});
	arr.sort();
	item = [...new Set(arr)];
	if(item.length==26){
		return true;
	}
	else {
		return false;
	}
	
}

🍗 题目3的答案

二毛解题思路:

/* 思路:首先判断n,是数组元素可以出现的次数。需要一个对象存放属性,属性值存放次数,如果次数大于0,就删除这个数组元素。 */

参考答案1

function deleteNth(arr,x) {
  var cache = {};
  return arr.filter(function(n) {
    cache[n] = (cache[n]||0) + 1;
    return cache[n] <= x;
  });
}

参考答案2:

function deleteNth(arr,x){
  while (true) {
    for (var i = 0; i < arr.length; ++i) {
      var count = 0;
      
      for (var j = 0; j < arr.length; ++j) {
      
        if (arr[i] === arr[j]) {
          ++count;
          
          if (count > x) {
            arr.splice(j, 1);
            break;
          }
        }        
      }
      if (j !== arr.length) break;      
    }
    if (i === arr.length) break;
  }
  
  return arr;
}

参考答案3

function deleteNth(arr,x){
  var obj = {}
  return arr.filter(function(number){
    obj[number] = obj[number] ? obj[number] + 1 : 1
    return obj[number] <= x
  })
}

🍗 题目4的答案

二毛解题思路:

/* 思路:先转为小写。 然后判断字符串单个字符的出现次数。如果只有1次,就插入(到一个数组,如果出现多次,就插入一个),最后合并数组即可。*/

参考答案1:

function duplicateEncode(word){
  return word
    .toLowerCase()
    .split('')
    .map( function (a, i, w) {
      return w.indexOf(a) == w.lastIndexOf(a) ? '(' : ')'
    })
    .join('');
}

参考答案2

function duplicateEncode(word) {
  word = word.toLowerCase();
  return word.replace(/./g, m => word.indexOf(m) == word.lastIndexOf(m) ? '(' : ')');
}

🍁后序

本系列会定期更新的,题目会由浅到深的逐步提高。

求关注求点赞 👍~~🍭🍭🍭

可以关注我的公众号:前端毛小悠。欢迎阅读

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!