1.设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),

且只允许使用两个附加变量。

方法一:

每次将数组中的元素右移一位,循环K次,则实现了右移K位。

例如,

原始字符串:abcd1234

右移一位:4abcd123

右移一位:34abcd12

右移一位:234abcd1

右移一位:1234abcd

循环4次,则实现了右移4次

实现函数如下:

voidright_shift(char*str,intN,intK)

{chartemp;

K%=N;//目的是,当K > N时,移动K次与移动K-i*N次是一样的。while(K--)

{

t=str[N-1];for(inti=N-1; i>0; i--)

str[i]=str[i-1];

str[0]=t;

}

}

从上面的实现代码可以看出,

由于K %= N, 所以while循环的K值是小于N的。所以时间复杂度最大为O(N^2), 空间复杂度为O(1),不符合题目要求。

方法二:

对于原始字符串abcd1234,右移2位后为:34abcd12。

通过比较可以看出,有两段子字符串的顺序是不变的。abcd12和34。

则可发现,右移K位的过程就是把数组的两部分交换的过程。

例如:abcd12|34.

对abcd12逆序排列:21dcba

对34逆序排列:   43

对全部的21dcba|43进行逆序排列:34abcd21.

得出如下结论:

将字符串S="abcd1234"分为两部分X="abcd12"和Y="34"。那么S=(X, Y)

X逆序记为X'="21dcba"

Y逆序记为Y'="43"

则(X', Y')="21dcba43"整体再逆序为"34abcd12" = (Y, X)

即(X', Y')' = (Y, X)

代码实现如下:

void reverse(char* str, int begin, int end)

{

char temp;

for( ; begin

{

temp = str[end];

str[end] = str[begin];

str[begin] = temp;

}

}

void right_shift(char *str, int N, int K)

{

K %= N;

reverse(str, 0, N - K -1);

reverse(str, N - K, N - 1);

reverse(str, 0, N - 1);

}

该算法则实现了在线性时间内实现右移操作了。

编写主函数测试如下:

#include

#include

int main()

{

char str[] = "abcd1234";

printf("The initial string:%s\n", str);

right_shift(str, 8, 2);

printf("The string after right shift:%s\n", str);

system("pause");

return 0

}

2.实现对字符串进行左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n), 空间复杂度为O(1).例如,原始字符串:abcd1234,左旋转2位后为:cd1234ab通过上面的1的分析,只是把右移改为左移。其他方法相同。代码实现如下:

void reverse(char* str, int begin, int end)

{

char temp;

for( ; begin

{

temp = str[end];

str[end] = str[begin];

str[begin] = temp;

}

}

void right_shift(char *str, int N, int K)

{

K %= N;

reverse(str, 0, K -1);

reverse(str, K, N - 1);

reverse(str, 0, N - 1);

}

int main()

{

char str[] = "abcd1234";

printf("The initial string:%s\n", str);

right_shift(str, 8, 2);

printf("The string after right shift:%s\n", str);

system("pause");

return 0

}

java 字符串 移位_算法学习之字符串左移和右移相关推荐

  1. [转] 算法学习之字符串左移和右移

    算法学习之字符串左移和右移 1.设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N), 且只允许使用两个附加变量. 方法一: 每次将数组中的元素右移一位,循环K次,则实现了右移 ...

  2. 两个字符串的最长公共子序列长度_算法学习笔记(58): 最长公共子序列

    (为什么都更了这么多篇笔记了,这时候才讲这么基础的内容呢?因为我本来以为LCS这种简单的DP不用讲的,结果CF不久前考了LCS的变式,然后我发现由于自己对LCS一点都不熟,居然写不出来 ,于是决定还是 ...

  3. java集合转字符串拼接_关于集合和字符串的互转实现方法

    今天在写项目的时候遇到一个问题,就是要把得到的一个集合转换成字符串,发现 import org.apache.commons.lang.stringutils; 有这么一个简单的方法:string s ...

  4. 【算法学习】字符串哈希(Hash)

    什么是字符串Hash 构造字符串Hash 1)自然溢出方法 2)单Hash方法 3)双Hash方法 4)三种不同的构造方法的对比 获取子串的Hash O(1) 1)例子 2)公式 具体的题目例子 1) ...

  5. java编程学习方法_在线学习Java编程的最佳方法

    java编程学习方法 1.简介 Java是使用最广泛的编程语言之一. 根据Github的最新报告 ,Java被列为仅次于JavaScript的第二大最常用的编程语言. 掌握Java的人有很多话题. 好 ...

  6. python字符串操作_浅谈Python 字符串特有的操作方法

    来源:(微信号:python_cat)" 正如<你真的知道Python的字符串是什么吗?>所写,Python中字符串是由Uniocde编码的字符组成的不可变序列,它具备与其它序列 ...

  7. .net mysql字符串截取_【MySQL】字符串截取之SUBSTRING_INDEX和【MySQL】字符串四则运算...

    substring_index(str,delim,count) str:要处理的字符串 delim:分隔符 count:计数 例子:str=www.google.com 1.count是正数,那么就 ...

  8. 大顶堆删除最大值_算法学习笔记(47): 二叉堆

    堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...

  9. python中abc属于字符串吗_Python基础学习:字符串

    Python 版本: 3.6.2 操作系统: Windows 作者: SmallWZQ 在 Python 中,字符串也是一种数据类型.相比其它数据类型,字符串算是比较复杂的.为 何呢?因为字符串不仅包 ...

最新文章

  1. 计算机考研数据结构重点
  2. 手把手教你安装Flutter(Flutter起步之安装)
  3. html 鼠标单击单元格,vue-easytable点击表格中某个单元格操作
  4. 什么是操作系统 PV 操作
  5. 用SHELL脚本来防SSH和vsftpd暴力破解(第②版)
  6. 属于你们的“礼仪小课堂”
  7. linux服务器指示灯,【转】明明白白你的Linux服务器——故障篇 | 旺旺知识库
  8. express ajax分页实例,DevExpress Navigator 数据分页 示例
  9. db2 常用命令(二)
  10. 对话中国AI先锋,生态科技岛首秀深圳
  11. inux中tail命令---用于查看文件内容
  12. PHPExcel基本使用(2) 导入图片
  13. 搞懂差分密码分析,看这篇文章就够了!!
  14. android system image,android systemimage默認大小以及如何修改
  15. Angularjs1 [$rootScope:inprog] inprogress error
  16. 电商直播发展正夯,云计算技术硬核支撑
  17. 解决QQ语音通话后耳机失效的问题
  18. 中安未来护照阅读器助力电子客票的推广和落实让你的出行说走就走
  19. 用二次函数研究三次多项式函数的零点问题【中阶和高阶辅导】
  20. “重塑安全边界,揭秘零信任业务保障”,联软科技下一代零信任访问管理系统发布

热门文章

  1. Undefined control sequence.l.113 \LinesNumbered
  2. pytorch: Parameter 的数据结构
  3. tensorflow: 图像处理模块 tf.image
  4. ORACLE 11.2.0.4 OCR VOTING DISK 模拟恢复场景
  5. vue循环出来列表里面的列表点击click事件只对当前列表有效;
  6. CMakeFiles/species.inc.dir/build.make:57: recipe for target 'CMakeFiles/species.inc' failed
  7. python3 小工具
  8. plsql 连接oralce数据库,报ora 12557 tns 协议适配器不可加载错误
  9. Dart 基礎 - 3
  10. Qt 5.9.1 连 MYSQL 5.7数据库