论left-pad的实现
这两天微博上看到左耳朵耗子吐槽了一下node社区的left-pad的代码,原po链接

我也思考了一下 怎么用实现一个left-pad比较合适,上图代码确实比较搓
leftpad功能,就是字符串前面拼指定字符到固定长度,比如
leftpad('hello',20,'1'),就要返回'111111111111111hello'
版本1 用数组+join
function leftpad(str, len, ch) {
if (!ch && ch !== 0) ch = ' ';
var len = len - str.length;
return Array(len).join(ch) + str;
}
版本2 用一个带length属性的对象去实现join,免去了创建arr的步骤,性能应该回好点
function leftpad(str, len, ch) {
if (!ch && ch !== 0) ch = ' ';
var len = len - str.length;
return Array.prototype.join.call({
length:len
},ch)+str;
}
如果把Array.prototype.join缓存到外部变量里,多次使用速度更快
var _join = Array.prototype.join
function leftpad(str, len, ch) {
if (!ch && ch !== 0) ch = ' ';
var len = len - str.length;
return _join.call({
length:len
},ch)+str;
}
版本3 二分法
上面复杂度都是O(N)的,既然核心思路是把字符串重复n次,可以用二分法,比如把s,重复20次,拼在str前面,大概过程如下
total = ''
ch = 's'
20是偶数
ch变成ss
长度变成10
10是偶数
ch变成ssss
长度变成5
5是奇数
total += ch(total变成ssss)
ch变成ssssssss(8个)
长度变成2
2是偶数
ch继续变成(ssssssssssssssss)(16个s)
长度变成1
total= total+ch(4个加16个)
结束代码 拼接str 返回
代码如下
function leftpad(str, len, ch) {
if (!ch && ch !== 0) ch = ' ';
var len = len - str.length,
total = ''
while (true) {
// 如果len是基数,total上就加一个ch
if (len % 2 == 1) total += ch;
if (len == 1) return total + str;;
// 每次ch都变成chch
ch += ch;
//长度减半
len = parseInt(len / 2);
}
}
最后写完这些,看了耗子大神微博贴的代码,突然想起求余和除以二取整,可以用 按位与len&1 和右移len>>1代替,囧,还是代码写的太少,没想到
最后代码
function leftpad(str, len, ch) {
if (!ch && ch !== 0) ch = ' ';
var len = len - str.length,
total = ''
while (true) {
// 如果len是基数,total上就加一个ch
if (len & 1 == 1) total += ch;
if (len == 1) return total + str;;
// 每次ch都变成chch
ch += ch;
//长度减半
len = len>>1;
}
}
大家可以尝试用python实现一下(不要用自带的rjust),本文仅提供一个思路,很小的一个功能函数,可能还会有很多更好的优化和实现,欢迎大家多指教写代码过程中还是要多思考,共勉
论left-pad的实现的更多相关文章
- Allegro之Enhance pad Entry(增强焊盘进入约束功能)的使用
pcb布线时,有时候会从器件的焊盘往外拉线,为了避免出现类似情况 出现锐角焊盘内绕线等等 可在add connect操作下,右键勾选Enhance pad Entry来增强焊盘进入的约束,可有效防止上 ...
- 发布一个免费开源软件-- PAD流程图绘制软件PADFlowChart
软件的可执行文件下载:PADFlowChart-exe.zip MD5校验码:91FCA9FEC9665FD09BEB3DA94ADC1CE6 SHA1校验码:ECD742AA3092A085AB07 ...
- 【Bugly安卓开发干货分享】Android APP 快速 Pad 化实现
项目背景 采用最新版本手机 APP(之后称为 MyApp)代码,实现其 Pad 化,为平板和大屏手机用户提供更好的体验.为实现 MyApp 的 Pad 化工作,需要我们首先来了解一下 MyApp 项目 ...
- [LintCode] Left Pad 左填充
You know what, left pad is javascript package and referenced by React: Github link One day his autho ...
- C#:判断软件运行的环境是否是Pad(PC)
一.需求:Pad上显示某功能块,PC机上隐藏. 二.方法:从外围设备获取值判断是否是Pad. 三.具体参考代码如下: 1.外围设备值类型如下: public enum ChassisTypes { O ...
- CRM 2013 移动终端 介绍和PAD下载地址
IPHONE 浏览器界同 Pad 端 APP (目前不支持中文,大家可以用美国账号下载,谁有分享一下) https://itunes.apple.com/en/app/microsoft-dynam ...
- android判断pad还是手机
第一种. Rect frame = new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); if (fr ...
- 34.pad designer警告
1.Drill hole size is equal or larger than smallest pad size. Pad will be drilled away 原因:钻孔直径太大,直接把p ...
- 21.altera fpga 芯片中 pin 和 pad 区别
在chip planner 中 ,看管脚时,会看到 pin 和pad 同时出现, 如 pin120/pad174 Bank 4 那么有什么区别? PIN指芯片封装好后的管脚,即用户看到的管脚: PAD ...
- android 开发解密时出现pad block corrupted 错误
情景:在虚拟机上运行正常的,但是到我的真机上就解密失败,出现pad block corrupted ,据说是版本原因:我机器是小米3 最新版的android 4.2 出现问题的代码: privat ...
随机推荐
- CF Codeforces Round #258 (Div. 2) B (451B)
题意:找出一段逆序! 预存a[]数组到b[]数组.将b排序,然后前后找不同找到区间[l,r],然后推断[l,r]是否逆序就能够了!.当然还得特判本身就是顺序的!! ! AC代码例如以下: #inclu ...
- phpExcel在封装
<?php /** * 数组生成Excel * @author zouhao zouhao619@gmail.com * 使用示例 * $excel =new Excel(); $data=ar ...
- 1.Solution的Build、Rebuild和Clean
大家好,我是原文,这篇随笔是对原文的翻译以及自己的体会. 做程序员没追求的话是永远找不到女朋友的,当然有追求也找不到,这个先不提,好在有追求的时候我是充实而且开心的.现在我们的问题是,每天调试项目,在 ...
- JavaScript之面向对象学习六原型模式创建对象的问题,组合使用构造函数模式和原型模式创建对象
一.仔细分析前面的原型模式创建对象的方法,发现原型模式创建对象,也存在一些问题,如下: 1.它省略了为构造函数传递初始化参数这个环节,结果所有实例在默认的情况下都将取得相同的属性值,这还不是最大的问题 ...
- C#文件压缩
/// <summary> /// 文件压缩 /// </summary> /// <param name="filesUrl">多个文件路径& ...
- 关于消息推送和service的一些调查-清理内存通知栏点击无响应
起因:做了两个带推送的app:HiApp和WeApp,前者个推,后者百度推送,但前者有一个小缺陷. 现象:两部手机 1.htcD820t手机,运行中的app利用自带的关闭最近程序后,通知栏不清理该ap ...
- NSURLSessionConfiguration的简单实用
NSURLSessionConfiguration 基于前面学习了NSURLSession的知识,这边文章就讲下NSURLSessionConfiguration相关应用,(这名字可真长). 简而言之 ...
- csapp lab3 bufbomb 缓存区溢出攻击 《深入理解计算机系统》
这个实验主要是熟悉栈,和了解数据缓存区溢出的问题. 数据缓存区溢出:程序每次调用函数时,会把当前的eip指针保存在栈里面,作为被调用函数返回时的程序指针.在被调用程序里面,栈是向下增长的.所有局部变量 ...
- [非技术参考]C#基础:使用Thread创建线程(1)
Thread类可以创建和控制线程,Thread类的构造函数重载为接受ThreadStart和ParameterizedThreadStart类型的委托参数.下面我们用一个例子来解释怎样用Thread类 ...
- 关于Connection must be valid and open.
这个Bug真心很操蛋! 我的网站在公司做的运行一切都没问题,回家后咋自己的电脑上出现了Connection must be valid and open.这个问题. 我最后还是在英文网站的一个不起眼的 ...