编程珠玑(二)字符串左旋

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

编程珠玑第二章的内容,有些内容没有看明白作者的意思。下面是向量左旋和变位词的问题。

一、将一个n元向量左旋转i个位置。例如当N=8,i=3时,向量abcdefgh旋转为defghabc。
这个题目编程之美也有2.17节数组的循环移位和3.1节字符串移位包含的问题。总结下,大概有5种解法,但是编程珠玑上有两种不是很明白,简单介绍下三种算法。

第一种算法比较直接,可以写一个每次都向左移动一位,移动3次即可完成,算法复杂度为i*N。这里还有一个误区,往往会认为i<N其实,并不一定,也可能会有i>>N的情况,这个时候,可以注意到当循环移动N次后向量还原成原来的样子,所以可以先对i=i%N,这样的话i就不会很大,算法复杂度为O(N2)。

第二种算法可以利用空间换时间的方法。也是先对i处理i=i%N,然后开辟一个i大小的空间,保存字符串前i个值。然后直接对把字符串从第i位向前移动i位,然后把空间i个字符补充在后面即可。

第三种算法是通过反转,可以把字符串分为ab两个字串,对a反转~a,对b反转得到~b,ab变为~a~b然后对~a~b整体反转,即可得到ba。此算法还可以针对有些要求,例如要求对abc字符串中c串和a串调换位置,即可对a、b、c串分别进行反转然后整体反转即可。这样时间复杂度只与N有关系为O(N)。下面是三种算法的代码。

#include <iostream>
using namespace std;

void leftShift1(char *a, int len, int i);
void leftShift2(char *a, int len, int i);
void leftShift3(char *a, int len, int i);
void reverse(char *a, int s, int e);

int main()
{
        char a[] = "abcdefgh";
        leftShift3(a, 8, 3);
        printf("%s\n", a);
        return 0;
}

void leftShift1(char *a, int len, int i)
{
        i=i%len;
        while(i--)
        {
                char temp = a[0];
                for(int j=0; j<len; j++)
                        a[j] = a[j+1];
                a[len-1] = temp;
        }
}

void leftShift2(char *a, int len, int i)
{
        char *temp = new char[i]();
        memcpy(temp, a, i);
        memcpy(a, &a[i], len-i);
        memcpy(&a[len-i], temp, i);
}


void leftShift3(char *a, int len, int i)
{
        reverse(a, 0, i-1);
        reverse(a, i, len-1);
        reverse(a, 0, len-1);
}
void reverse(char *a, int s, int e)
{
        while(s<e)
        {
                char temp = a[s];
                a[s] = a[e];
                a[e] = temp;
                s++;
                e--;
        }
}


 

编程珠玑--左旋字符串 其实编程之美也有类似的题,这道题是编程珠玑章的题目。 题目描述:给定一个字符串,将字符串循环移位K次。 最简答的方法就是,通过O(n)的辅助空间,将数组循环移位,时间复杂度就是O(n) 但是如果要求空间复杂度为O(1)呢? 观察规律可知,对前K位反转以及后面的反转,最后对整个字符串反转就能达到O(1)的空间复杂度。 PS:注意处理k>字符串的长度的情况 1 #inclu... 阅读详情

相关推荐

左旋字符串——编程珠玑和STL所想到的

在看编程珠玑时候有这么一题: 将一个长为n的字符串左旋i位,例如abcdefg左旋3位得到:defgabc 在书上提到了两种解法,分别如下,习题中有这么一个问题:i和n的最大公约数如何才能被程序用到?一时间没有思路,看看STL是怎么实现的,果然用到了最大公约数。最后就介绍STL中的rotate算法。 法一:从a[0]开始,每隔i位,将后面的元素移到前面去,将a[i]移到a[0],a[2*

Carl.Chen@seu@zju 1056

编程算法 - 左旋字符串 代码(C)

版权声明:本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/u012515223/article/details/37689725 左旋字符串 代码(C)本文地...

weixin_30838921的博客 159

编程珠玑 一维向量左旋

<br />   今天看了编程珠玑上面的一道题目,书本11页第算法,感觉很有趣,特别是第三个实现的算法,非常巧妙,解决这个问题有三个算法,第一个也是最容易想到需要额外的分配i个空间,第算法我还是不怎么理解,没实现,第三种算法最精彩,也是最容易实现,深刻体会到简洁就是美的自然法则.<br /> <br />    算法一实现:<br />    string Reverse(string &s, int n) { int i,j; string temp; temp=s.substr(0

lhcxx1987的专栏 623

程序员编程艺术 第一章 左旋字符串

程序员编程艺术 第一章 左旋字符串

gdfyug的博客 427

字符串左旋转--编程珠玑

问题描述:待移动的数组假设为str,长度为len,需要左旋转rotate位 方法一:最简单方法。将数组的前rotate元素复制到一个临时数组中,然后将余下的len-rotate个元素向左移动i个位置,最后将最初的rotate个元素从临时数组中复制到a中余下的位置。这样的做法产生了过大的存储空间的消耗。 方法:杂技算法。移动str[0]到临时变量tmp,然后移动str[rotate]至str[0

u013115185的博客 559

向量左旋算法之取模置换

如何使用取模置换的方法,实现向量左旋操作。

猫晨的技术小屋 862

左旋字符串 【微软面试100题 第十六题】

题目要求:   定义字符串左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。   例如:把字符串abcdef左旋2位得到字符串cdefab。请实现字符串左旋转函数。   参考资料:剑指offer第42题、编程珠玑章 题目分析:   方法1 临时空间法:将前i个元素先复制到临时空间中,然后将余下的n-i个元素前移i个位置,最后再把临时空间中的元素放到余下的

tractor_man的专栏 425

编程珠玑——字符串移位

1.题目描述 讲一个n圆一维向量向左旋转i个位置。例如,当n=8且i=3时,向量abcdefgh旋转为defghabc。现在要求在O(n)的时间复杂度,且空间复杂度为O(1)2.算法 2.1字符串逆序解决 例如:当n=8且i=3时,向量为abcdefgh。先旋转前3个字符得到cbadefgh,再转换后5个字符得到cbahgfed,最后旋转整个字符串得到defghabc。 //翻转字符

xia_xiao_mo的专栏 642

字符串反转,神奇的算法-读《编程珠玑(第版)》

最近在缓慢地读《编程珠玑(第版)》(英文名Programming Pearls),书很薄(正文才160多页),但正如其封面“近20年来众多大师级程序员一致推崇的作品”所示,这本经典哪能是我一下子就能读完的?书中有很多简洁但有趣的例子分析,更有作者的实际经验及注意点的阐述,值得一点点地读,一遍不够以后再来第、三遍... 另外,前些天发现51CTO读书频道有《编程珠玑(续)》(英文名 More

海阔天空 1079

左旋字符串

题目:字符串左旋转操作:把字符串前面的若干字符移到字符串的后面。例如:字符串abcdefg左旋2位得到cdefgab。请实现左旋字符串函数,要求对于长度为n的字符串,时间复杂度为O(n),辅助内存为O(1)。 分析1:看到这道题我们最直观的思路就是:如果要把长度为n的字符串左移k位,那么我们可以动态分配长度为k的临时数组,存储前面k个字符,然后将后面的字符逐一向前移动k位,然后将临时数组中

happylife1527的专栏 426

面试题42:翻转单词顺序VS左旋字符串

一、翻转单词顺序 首先反转字符串,然后再反转字符串中的每一个子字符串。 public class Solution { public String ReverseSentence(String str) { if(str.length()==0||str.isEmpty()) return str; char[] chars=str.toCharArra

ddd_1206的博客 491

循环左移字符串

题目   字符串左旋转操作是把字符串前面的若干字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串“abcdefg”和数组2,该函数将返回左旋2位得到的结果“cdefgab”。分析   通过reverse操作:一个序列abcdefg,如果向左循环移动n位,例如2位,则会编程(defg)(abc),我们把原序列分成两部分,A=(abc),B=(defg),原序列为A

1277

[编程珠玑题目] 一维向量左旋

最近太忙了买了编程珠玑之后就翻过2页,今天正好@neiddy 问我看里面的题目,就花了点时间看看做一下。自己思考后跟书上讲的第种有效方法很想,考虑后就在想执行效率,所以写了代码来看一下,最后需要做⌈ length/rotatelength⌉ or +1(就不写那么复杂了)次此swap,每次swap做routateLength次交换,因此时间复杂度是O(n),空间复杂度O(1)。其实第一种实现思路...

u012541060的专栏 219

剑指offer-面试题42:翻转单词顺序VS左旋字符串

题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串“I am a student.",则输出"student. a am I"。 思路:《编程珠玑》第章有类似题目,思路就是先翻转每个单词,然后再翻转整体。

moses1213的专栏 591

字符串循环左移

左旋字符串问题题外话:话说这个问题早在40多年前就被人搞得非常通透了。《编程珠玑 (第版)》第章最开头问题B也讲了……好好看书很重要。这个东西是比较老的问题了,1971年就被一个做编辑器的人研究透了(《编程珠玑(第版)》上面写的) ……现在还在作为面试题出现。给定长度为n的字符串,例如n = 6 abcdef, 左移动一位的话变为 bcdefa ,移动两位的话变为cdefab,问左移动m位

caopengcs的专栏 5954

算法05】左旋字符串

算法05】左旋字符串 题目:字符串左旋转操作:把字符串前面的若干字符移到字符串的后面。例如:字符串abcdefg左旋2位得到cdefgab。请实现左旋字符串函数,要求对于长度为n的字符串,时间复杂度为O(n),辅助内存为O(1)。 分析1:看到这道题我们最直观的思路就是:如果要把长度为n的字符串左移k位,那么我们可以动态分配长度为k的临时数组,存储前面k个字符,然后将后面的字...

weixin_30530339的博客 82

编程珠玑》读书笔记(一)

编程珠玑》(第版)第一部分主要是讲基础 第一章 开篇: 本章主要解决的问题是“在内存不足的情况下,如何对数据进行排序”,提出了两种解决方法:归并排序和位图排序。 归并排序:     思想是每次将两个有序表合成一个长的有序表,程序一般用递归来实现,时间复杂度是O(nlogn),需要O(n)的空间复杂度,稳定。 位图排序

qianqiang1989的专栏 480
上一篇: 编程珠玑(一)位图
下一篇: TCP/IP学习(五)ICMP、Ping、Tracerout和Telnet
ysu108
博客等级 码龄16年 246粉丝 206原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值