编程珠玑字符串反转

编程珠玑真是一本让人感觉到眼前一亮的书,虽然书不厚,但是里面的知识很贴近实际应用,也很有启发性,如果能真正的消化里面的内容,对程序的理解肯定会上一个档次。

本文给出的是第二章习题的第五题的大概程序!

#include<iostream>
using namespace std;

void move(int * arr, int arrsize,int n);//将数组arr的前n个元素左移
void show(int * arr,int arrsize);
void reverse(int * arr, int n, int m);
void move_re(int * arr, int arrsize, int n);
void move_re_twodif(int * arr, int arrsize, int n, int m);//把数组的前n个元素和后m个元素交换位置
int main()
{
	int arr[] = { 20, 15, 26, 302, 150, 264, 154, 284 };
	show(arr, 8);
	cout << endl;
	move_re(arr,8, 6);
	show(arr,8);
	move_re_twodif(arr, 8, 5, 3);
	show(arr, 8);
	return 0;
}

void move(int * arr,int arrsize, int n)
{
	int i = 0;
	int k = n%arrsize;
	for (; i <k; ++i)
	{
		int temp = arr[i];
		int m = i+k;
		while ( m < arrsize)
		{
			arr[m-k] = arr[m]; m+= k;
		}
		//if (m>=arrsize)
		arr[m-k] = arr[m%arrsize];
		show(arr, arrsize);
	}
}

void show(int * arr,int arrsize)
{
	int n = 0;
	while (n<arrsize)
	{
		cout << *(arr+n) << "\t"; ++n;
	}
		cout<<endl;
}

void reverse(int * arr, int n, int m)
{
	if (n >= m)return;
	int i = n;
	int j = m;
	for (; i < j;)
	{
		int temp = arr[i];
		arr[i++] = arr[j];
		arr[j--] = temp;
	}
}
void move_re(int * arr, int arrsize, int n)
{
	int k = n%arrsize;
	reverse(arr, 0, k - 1);
	reverse(arr, k, arrsize - 1);
	reverse(arr, 0, arrsize - 1);
}

void move_re_twodif(int * arr, int arrsize, int n, int m)//把数组的前n个元素和后m个元素交换位置
{
	if ((arrsize - m) < n)return;//如果后半段数据和前半段数据重叠就停止交换
	reverse(arr, 0, n - 1);
	reverse(arr, n, arrsize-m-1);
	reverse(arr, arrsize - m, arrsize - 1);
	reverse(arr, 0, arrsize - 1);
}

如有转载请说明出处!

时间: 2024-10-18 13:04:36

编程珠玑字符串反转的相关文章

C#编程实践--字符串反转

朴素反转 朴素解法,倒序遍历,字符串拼接,字符串性能低下,在长度已知的前提可以使用char数组代替 public static string NaiveReverse(string text) { string reverse = string.Empty; for (int i = text.Length - 1; i >= 0; i--) { reverse += text[i]; } return reverse; } StringBuilder拼接 进一步改进,使用StringBuild

由编程珠玑字符串倒置问题拓展到split之C\C++实现

http://www.klxsw.com/files/article/html/23/23394/21264595.html http://www.klxsw.com/files/article/html/23/23394/21264597.html http://www.klxsw.com/files/article/html/23/23394/21264601.html http://www.klxsw.com/files/article/html/23/23394/21264603.htm

编程珠玑--左旋字符串

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

编程珠玑番外篇

1.Plan 9 的八卦 在 Windows 下喜欢用 FTP 的同学抱怨 Linux 下面没有如 LeapFTP 那样的方便的工具. 在苹果下面用惯了 Cyberduck 的同学可能也会抱怨 Linux 下面使用 FTP 和 SFTP 是一件麻烦的事情. 其实一点都不麻烦, 因为在 LINUX 系统上压根就不需要用 FTP. 为什么呢? 因为一行简单的配置之后, 你就可以像使用本机文件一样使用远程的任何文件. 无论是想编辑, 查看还是删除重命名, 都和本机文件一样的用. 这么神奇的功能到底如何

《编程珠玑》高清pdf版

下载地址:网盘下载 作者简介 编辑 Jon Bentley是位于新泽西州Murray Hill的朗讯贝尔实验室计算机科学研究中心的技术委员会委员,Jon自1998年就成为Dr. Dobb's Joumal杂志的特约编辑,他的"编程珠玑"专栏多年来一直是顶级学术杂志Communications of the ACM最风行的特色专栏之一,而本书正是建立在这些专栏的基础之上. 目录 编辑 第一部分 基础 第1章 开篇 1.1 一次友好的对话 1.2 准确的问题描述 1.3 程序设计 1.4

《编程珠玑》笔记:数组循环左移

问题描述:数组元素循环左移,将包含 num_elem 个元素的一维数组 arr[num_elem] 循环左移 rot_dist 位.能否仅使用数十个额外字节的存储空间,在正比于num_elem的时间内完成数组的旋转? 一:Bentley's Juggling Alogrithm 移动变量 arr[0] 到临时变量 tmp,移动 arr[rot_dist] 到 arr[0],arr[2rot_dist] 到 arr[rot_dist],依此类推,直到返回到取 arr[0] 中的元素,此时改为从 t

一维向量旋转算法 编程珠玑 第二章

看了编程珠玑第二章,这里面讲了三道题目,这里说一下第二题,一维向量旋转算法. 题目:将一个n元一维向量(例数组)向左旋转i个位置. 解决方法:书上讲解了5种方法,自己只想起来2种最简单方法(下面讲的前两种). 1.原始方法. 从左向右依次移动一位,对所有数据平移:这样循环i次,算法最坏时间复杂度达n^2.耗时不推荐. 2.空间换时间. 顾名思义,申请一个i长度的空间,把前i半部分放到申请空间中,再把后面的所有数据向左移动i个位置,最后把申请的空间中的数据放到后半部分.浪费空间,不推荐. 3.杂技

《编程珠玑》第一章

一.题目: 如何在1MB的空间里面对一千万个整数进行排序?并且每个数都小于1千万.实际上这个需要1.25MB的内存空间(这里所说的空间是考虑用位图表示法时,每一位代表一个数,则1千万/(1024*1024*8) 约为1.25MB  ). 1MB总共有838,8608个可用位.所以估计也可以在1MB左右的空间里面进行排序了. 分析: 1)基于磁盘的归并排序(耗时间) 2)每个号码采用32位整数存储的话,1MB大约可以存储250 000 个号码,需要读取文件40趟才能把全部整数排序.(耗时间) 3)

Java编程基础-字符串

在Java语言中,字符串数据实际上由String类所实现的.Java字符串类分为两类:一类是在程序中不会被改变长度的不变字符串:另一类是在程序中会被改变长度的可变字符串.Java环境为了存储和维护这两类字符串提供了 String和StringBuffer两个类(在JDK1.5版本后出现了StringBuilder,该类被设计用作 StringBuffer 的一个简易替换). 一.字符串(String) 1.字符串概念了解 String 类代表字符串,Java 程序中的所有字符串字面值(如 "ab