codewars

1、

Complete the solution so that the function will break up camel casing, using a space between words.

Example

"camelCasing"  =>  "camel Casing"
"identifier"   =>  "identifier"
""             =>  ""

my ans :  步骤繁琐 正则不熟悉

function Fn(string){
 var arr = string.splir('')
 var indexArr=[]
 arr.map((item,index)=>{
  if(item.toUpperCase()===item){
        indexArr.push(index)
  }
 var count = 0;
 for( var i = 0 ; i<indexArr.length; i++){
    arr.splice(indexArr[i]+count,0,' ')
    count++
  }
    return arr.join('')
})}

注意插入多个大写字母 需要加count 下标向后移count

better ans:

function solution(string) {
  return(string.replace(/([A-Z])/g, ' $1'));

}

function solution(string) {
  return string.replace(/([a-z])([A-Z])/g, "$1 $2");
}

const solution = string => {
  return [...string].map((char) => {
    return (char === char.toUpperCase()) ? ` ${char}` : char;
  }).join('');
}

 2、

You are given an array (which will have a length of at least 3, but could be very large) containing integers. The array is either entirely comprised of odd integers or entirely comprised of even integers except for a single integer N. Write a method that takes the array as an argument and returns this "outlier" N.

Examples

[2, 4, 0, 100, 4, 11, 2602, 36]
Should return: 11 (the only odd number)

[160, 3, 1719, 19, 11, 13, -21]
Should return: 160 (the only even number)

my ans :

function findOutlier(int){
  var even = int.filter(a=>a%2==0);
  var odd = int.filter(a=>a%2!==0);
  return even.length==1? even[0] : odd[0];
}

3、

Implement the function unique_in_order which takes as argument a sequence and returns a list of items without any elements with the same value next to each other and preserving the original order of elements.

For example:

uniqueInOrder('AAAABBBCCDAABBB') == ['A', 'B', 'C', 'D', 'A', 'B']
uniqueInOrder('ABBCcAD')         == ['A', 'B', 'C', 'c', 'A', 'D']
uniqueInOrder([1,2,2,3,3])       == [1,2,3]

my ans:

var uniqueInOrder=function(iterable){
  //your code here - remember iterable can be a string or an array
  if(typeof(iterable) === 'string') iterable =iterable.split('');
  var arr = []
  if(Array.isArray(iterable) && iterable.length >0 ){
    iterable.map((item,index)=>{
      if(iterable[index] === iterable[index+1]){
        arr.splice(index+1 , '')
      }else{
        arr.push(item)
      }
    })
  }
  return arr;
}


借鉴改进:
var uniqueInOrder=function(iterable){
  //your code here - remember iterable can be a string or an array
  //array string均可以用 for循环遍历 无需上个赘述判断转化  无返回值 会改变原数组
  var arr = []
  for(var i = 0 ; i<iterable.length; i++){
    if(iterable[i] !== arr[arr.length-1]){
        arr.push(iterable[i])
      }
  }
  return arr;
}

better ans :

var uniqueInOrder=function(iterable){
    return [...iterable].filter((a, i) => a !== iterable[i-1])
}

4、Are they the "same"?

Given two arrays a and b write a function comp(a, b) (orcompSame(a, b)) that checks whether the two arrays have the "same" elements, with the same multiplicities (the multiplicity of a member is the number of times it appears). "Same" means, here, that the elements in b are the elements in a squared, regardless of the order.

Examples

Valid arrays

a = [121, 144, 19, 161, 19, 144, 19, 11]  
b = [121, 14641, 20736, 361, 25921, 361, 20736, 361]

my ans :

滤清思路 找对方向  次幂算出来比较是否相同

  function suq(array1) {
      return array1.map((item) => item = item * item)
    }

    function comp(array1, array2) {
      //your code here
      if (!array1 || !array2) return false
      array1.sort((a, b) => a - b)
      array2.sort((a, b) => a - b)
      
      var array1 = suq(array1)
       array1.map(item => {
        const index = array2.indexOf(item)
        if (index !== -1) {
         array2.splice(index, 1)
        }
        return array2
      })

      return array2.length === 0;

    }


spilce会改变原数组  

better ans :

function comp(array1, array2) {
  if(array1 == null || array2 == null) return false;
  array1.sort((a, b) => a - b); array2.sort((a, b) => a - b);
  return array1.map(v => v * v).every((v, i) => v == array2[i]);
}


function comp(a, b) {
  return !!a && !!b && a.map(x => x*x).sort().join() == b.sort().join();
}


function comp(array1, array2) {
  if (array1 == null || array2 == null) return false;
  array1.sort((a, b) => a - b);
  array2.sort((a, b) => a - b);
  return array1.every((item, index) => item * item == array2[index]);
}


function comp(array1, array2){
  return !!array2 && !!array1 && array2.every( a=> array1.some( (b,i)=> a===b*b && delete array1[i] ) )  
}

You are given an array(list) strarr of strings and an integer k. Your task is to return the first longest string consisting of k consecutive strings taken in the array.

Examples:

strarr = ["tree", "foling", "trashy", "blue", "abcdef", "uvwxyz"], k = 2

my ans :忘记保存   

better ans: 

function longestConsec(strarr, k) {
		var longest = "";
		for(var i=0;k>0 && i<=strarr.length-k;i++){
			var tempArray = strarr.slice(i,i+k);
			var tempStr = tempArray.join("");
			if(tempStr.length > longest.length){
				longest = tempStr;
			}
		}
		return longest;
}


function longestConsec(strarr, k) {
  if( strarr.length==0 || k> strarr.length || k <1 ) return "";
  let lens = strarr.map( (_,i,arr) => arr.slice(i,i+k).join('').length ),
      i = lens.indexOf( Math.max(...lens) );
  return strarr.slice(i,i+k).join('')
}


const longestConsec = (strarr, k) =>
  k > strarr.length || k <= 0 ? `` :
    [...Array(strarr.length - k + 1)].reduce((pre, _, idx) => (str => str.length > pre.length ? str : pre)(strarr.slice(idx, idx + k).join(``)), ``);



function longestConsec(source, k) {  
  return new Array(Math.max(0, Math.min(k >= 0 ? source.length - k + 1 : k, source.length)))
        .fill('')
        .map((s, i) => source.slice(i, i + k).join(''))
        .reduce((max, x) => max.length < x.length ? x : max, '');
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值