首页 > 其他分享 >写一个字符串重复的repeat函数

写一个字符串重复的repeat函数

时间:2024-11-23 09:02:18浏览次数:5  
标签:count repeat console 函数 重复 abc 字符串

/**
 * 重复一个字符串指定的次数。
 *
 * @param {string} str 要重复的字符串。
 * @param {number} count 重复的次数。必须是非负整数。
 * @returns {string} 重复后的字符串。如果count为0,返回空字符串。如果count为负数,抛出错误。
 * @throws {RangeError} 如果 count 是负数。
 */
function repeat(str, count) {
  if (count < 0) {
    throw new RangeError("repeat count must be non-negative");
  }

  if (count === 0) {
    return "";
  }

  if (count === 1) {
    return str;
  }

  // 使用更高效的算法处理较大的重复次数
  let result = '';
  let pattern = str;
  while (count > 0) {
    if (count & 1) { // 检查count的最后一位是否为1
      result += pattern;
    }
    count >>= 1; // count右移一位,相当于除以2
    pattern += pattern; // pattern自身拼接,长度翻倍
  }
  return result;
}


// 测试用例
console.log(repeat('abc', 3)); // 输出 'abcabcabc'
console.log(repeat('abc', 0)); // 输出 ''
console.log(repeat('abc', 1)); // 输出 'abc'
console.log(repeat('abc', 5)); // 输出 'abcabcabcabcabc'

try {
  console.log(repeat('abc', -1));
} catch (e) {
  console.error(e); // 输出 RangeError: repeat count must be non-negative
}


// 性能测试 (大型字符串和重复次数)
const longString = 'This is a long string to test performance.';
const repeatCount = 10000;
console.time('repeat');
repeat(longString, repeatCount);
console.timeEnd('repeat');

//  原生String.prototype.repeat() 性能对比 (如果浏览器支持)
if (String.prototype.repeat) {
  console.time('native repeat');
  longString.repeat(repeatCount);
  console.timeEnd('native repeat');
}

代码解释和改进:

  1. 错误处理: 添加了对负数 count 的错误处理,抛出 RangeError,符合规范。

  2. 特殊情况优化:count 为 0 和 1 的情况进行了特殊处理,直接返回空字符串或原始字符串,提高效率。

  3. 高效算法: 使用位运算和字符串拼接的组合,实现更高效的重复逻辑,尤其是在重复次数较大时,性能显著提升。 避免了简单的 for 循环拼接,减少了字符串连接操作的次数。

  4. String.prototype.repeat() 兼容性: 考虑到旧版浏览器可能不支持原生的 String.prototype.repeat() 方法,该函数提供了一个独立的实现,保证了兼容性。 同时,代码中包含了性能测试,可以与原生方法进行对比。

  5. 注释: 添加了详细的 JSDoc 注释,解释函数的功能、参数和返回值,提高代码可读性和可维护性。

使用方法:

直接调用 repeat(str, count) 即可,其中 str 是要重复的字符串,count 是重复次数。

性能对比:

在现代浏览器中,原生 String.prototype.repeat() 方法通常具有最佳性能。 但是,提供的 repeat 函数在不支持原生方法的旧版浏览器中,以及在某些特定场景下,仍然具有竞争力,并且代码清晰易懂,方便维护。

标签:count,repeat,console,函数,重复,abc,字符串
From: https://www.cnblogs.com/ai888/p/18564087

相关文章

  • oracle数据库---PL/SQL、存储函数、存储过程、触发器、定时器job、备份
    PL/SQL什么是PL/SQLPL/SQL(Procedure Language/SQL)是Oracle对sql语言的过程化扩展,指在SQL命令语言中增加了过程处理语句(如分支、循环等),使SQL语言具有过程处理能力。把SQL语言的数据操纵能力与过程语言的数据处理能力结合起来,使得PLSQL面向过程但比过程语言简单......
  • Python小白学习教程从入门到入坑------第十四课 函数基础(语法基础)
    一、函数def定义:将具有独立功能的代码块组织成一个整体,使其具有特殊功能的代码集作用:使用函数可以加强代码的复用性,提高编程续写的效率结构:def 函数名():     函数体注意:函数名要符合标识符规定,最好见名知意,调用函数前,必须保证函数已经存在eg:#1.定义函数#......
  • 改变函数调用上下文:apply与call方法详解及实例
    目录改变函数调用上下文:apply与call方法详解及实例一、什么是apply方法?1、apply语法2、apply示例二、什么是call方法?1、call语法 2、call示例三、apply和call的共同与差异1、apply和call的共同点2、apply和call的差异四、apply和call的其他实......
  • 20241022_095024 c语言 字符串的方法
    源始字符串strlen方法strcat方法strcpy方法strcmp方法大小写转换......
  • vTESTstudio系列14--vTESTstudio中自定义函数介绍1
    在上篇vTESTstudio系列的文章中,我们基于osek_tp.dll实现了诊断的发送和回复的最基本的脚本,但是我们可以看出来,这样的脚本是不具有普适性的,为了生成一个普适性的诊断请求回复的函数,接下来本系列的几篇文章会开始介绍一些优自定义的小函数,Let'sGo!!!目录1.自定义函数:1.1字符......
  • 字符串优化
    字符串问题\(\mathcalO(nm)-\mathcalO(1)\)比较字符串子串大小令\(lcp_{x,y}=\operatorname{lcp}(s[x\simn],s[y\simn])\),有\[lcp_{x,y}=\left\{\begin{aligned}&lcp_{x+1,y+1}+1&&s_x=s_y\\&0&&s_x\not=s_y\end{aligned}\right.\]......
  • 什么是虚函数和纯虚函数?以及区别
    什么是虚函数和纯虚函数?以及区别?虚函数:定义:被virtual关键字修饰的成员函数。在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数。其用法格式为:virtual函数返回类型函数名(参数表){函数体}。特性:虚函数实现多态性,通过指向派生类的基类指针或引用,访问派......
  • 关于我、重生到500年前凭借C语言改变世界科技vlog.8——函数递归
    文章目录1.递归的介绍2.递归的限制条件3.递归实战应用3.1求n的阶乘3.2顺序打印一个整数的每一位4.递归与迭代5.递归经典问题的拓展希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力!1.递归的介绍在vlog.2的printf函数的返回值举例中,我们使......
  • 实验三 C语言函数应用编程
    任务一#include<stdio.h>charscore_to_grade(intscore);//函数声明intmain(){intscore;chargrade;while(scanf("%d",&score)!=EOF){grade=score_to_grade(score);//函数调用printf("分数:%d,等级:%c\n......
  • C语言使用指针作为函数参数,并利用函数嵌套求输入三个整数,将它们按大到小的顺序输出。(
    输入三个整数,要求从大到小的顺序向他们输出,用函数实现。   本代码使用到了指针和函数嵌套。   调用指针做函数ex,并嵌套调用指针函数exx在函数ex中。(代码在下面哦!)一、关于函数 ex  1. 这个函数接受三个指针参数 int*p1 、 int*p2 和 int*p3 ,分别指......