什么是数组左旋?

数组左旋就是,对给定的n个元素的数组,向左旋转移动d个元素,例如

左旋2个元素,得到

方法一:使用临时数组

时间复杂度 : O(n) 
空间复杂度 O(d)

    public static void solution1(int[] array1, int d){int[] temp = new int[d];for (int i = 0; i < array1.length; i++){if (i < d){temp[i] = array1[i];} else {array1[i-d] = array1[i];}}int j = 0;for (int i = array1.length - d; i < array1.length; i++){array1[i] = temp[j++];}for (int i = 0; i < array1.length; i++){System.out.println(array1[i]);}}

方法二:依次进行数组左旋

时间复杂度 : O(n * d) 
空间复杂度 : O(1)


// Java program to rotate an array by
// d elementsclass RotateArray {/*Function to left rotate arr[] of size n by d*/void leftRotate(int arr[], int d, int n){for (int i = 0; i < d; i++)leftRotatebyOne(arr, n);}void leftRotatebyOne(int arr[], int n){int i, temp;temp = arr[0];for (i = 0; i < n - 1; i++)arr[i] = arr[i + 1];arr[n-1] = temp;}/* utility function to print an array */void printArray(int arr[], int n){for (int i = 0; i < n; i++)System.out.print(arr[i] + " ");}// Driver program to test above functionspublic static void main(String[] args){RotateArray rotate = new RotateArray();int arr[] = { 1, 2, 3, 4, 5, 6, 7 };rotate.leftRotate(arr, 2, 7);rotate.printArray(arr, 7);}
}

d等于几,就相当于做几次数组元素的移动

方法三:分组左旋法

时间复杂度 : O(n) 
空间复杂度 : O(1)

// Java program to rotate an array by
// d elements
class RotateArray {/*Function to left rotate arr[] of siz n by d*/void leftRotate(int arr[], int d, int n){/* To handle if d >= n */d = d % n;int i, j, k, temp;int g_c_d = gcd(d, n);for (i = 0; i < g_c_d; i++) {/* move i-th values of blocks */temp = arr[i];j = i;while (true) {k = j + d;if (k >= n)k = k - n;if (k == i)break;arr[j] = arr[k];j = k;}arr[j] = temp;}}/*UTILITY FUNCTIONS*//* function to print an array */void printArray(int arr[], int size){int i;for (i = 0; i < size; i++)System.out.print(arr[i] + " ");}/*Fuction to get gcd of a and b*/int gcd(int a, int b){if (b == 0)return a;elsereturn gcd(b, a % b);}// Driver program to test above functionspublic static void main(String[] args){RotateArray rotate = new RotateArray();int arr[] = { 1, 2, 3, 4, 5, 6, 7 };rotate.leftRotate(arr, 2, 7);rotate.printArray(arr, 7);}
}

说明:

1. 根据数组的长度n和左旋的大小d计算最大公约数,例如n=12, d=3, 则最大公约数为3

2. 根据最大公约数,对元素进行分组,则分为4组。{1,2,3}  {4, 5, 6} {7, 8, 9} {10, 11, 12}

3. 依次对每组的第1个元素、第2个元素,。。第gcd个元素进行大小为d的左旋

对1,4,7,10的左旋,我们得到

{4 2 3 7 5 6 10 8 9 1 11 12}

再对2,5,8,11的左旋,我们得到

{4 5 3 7 8 6 10 11 9 1 2 12}

再对3,5,8,12的左旋,我们得到

{4 5 6 7 8 9 10 11 12 1 2 3}

如此,便得到最终的结果。

方法三:逆转字符串

根据左旋的个数,将字符串进行分组。例如,源字符串为“abcdefg”, 左旋2个字符,则分组为

“ab” “cdefg”

接着,对各自的分组进行逆转:

“ba” “gfedc”

接着拼装起来

“bagfedc”

对拼装后的字符串逆转

“cdefgab”

【算法】数组左旋、字符串左旋相关推荐

  1. DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总

    DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台.刷题集合.问题为导向的十大类刷题算法(数组和字符串.栈和队列.二叉树.堆实现.图.哈希表.排序和搜索.动态规划/回溯法/递归/贪心/分治)总 ...

  2. 算法--------数组------反转字符串中的元音字母

    编写一个函数,以字符串作为输入,反转该字符串中的元音字母.示例 1:输入: "hello" 输出: "holle" 示例 2:输入: "leetcod ...

  3. 字符串左旋右旋——三步旋转法和移相法

    题目:实现一个函数,可以左旋字符串中的k个字符. AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA 方法一:三步旋转法 左旋程序思路:首先根据画图得知左旋后的结果,然后在分析 ...

  4. 剑指 offer set 19 翻转单词顺序 字符串左旋

    题目 1. 翻转单词 student. a am I 转换成 I am a student. 2. 字符串左旋 abba 1 转成 bbaa 总结 1. 先对每个单词旋转, 再整齐旋转 2. 先翻转一 ...

  5. 【C/C++】左旋字符串

    一.左旋 实现一个函数,可以左旋字符串中的k个字符. AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA 二.代码实现 (1)左旋n个字符得到的字符串 char* left_r ...

  6. 【C语言】实现一个函数,可以左旋字符串中的K个字符

    题目说明: 要求实现一个函数,可以左旋字符串中的K个字符: 其中: ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 解法一: 解题思路: 拿到一组字符串之后,我们首先设置一个临时变 ...

  7. C语言题目:左旋字符串.

    C语言题目:左旋字符串 两种方法: 方法一原理:把第一个元素放存放到某个变量,让除了第一个的元素全部向前移动一个索引,再把变量放到数组最后一个元素 实现: 方法二原理: 先让要左旋的那几个字符逆序,再 ...

  8. 【C语言】字符串加密解密,字符串左旋,杨氏矩阵,删除字符串中出现次数最少的字符

    目录 1.字符串解密加密 2.字符串左旋 3.杨氏矩阵 4.删除字符串中出现次数最少的字符 好久不见,自从刷完剑指offer里面所有目前可以用C解决的题目吧之后,就在刷一些高校的题和华为机试题,一直在 ...

  9. C语言----字符串左旋

    题目: 实现一个函数,可以左旋字符串中的n个字符. 例如 ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB #include <stdio.h> #include < ...

  10. java翻转单词顺序split_剑指offer解题报告(Java版)——翻转单词顺序 左旋字符串 42...

    引言 这种翻转的问题会遇到很多,其实就是一个倒序的问题,对于第一个题只是想翻转单词的顺序,而并不想把整个字符串翻转了,如果完全翻转的话,比如I am a student.中所有字符翻转得到.tnedu ...

最新文章

  1. 用U盘安装VMware ESXi4
  2. 发送Request Payload数据演示
  3. R语言数据包自带数据集之ToothGrowth数据集字段解释、数据导入实战
  4. 腾讯林衍凯:图神经网络,考虑「拓扑信息」会怎样?
  5. JavaWEB后端支付银联,支付宝,微信对接
  6. linux共享库 == windows动态库
  7. Zookeeper与paxos算法
  8. css 背景图怎么设置自动填充满_CSS-布局与定位
  9. Python在信号与系统(1)——Hilbert兑换,Hilbert在国家统计局的包络检测应用,FIR_LPF滤波器设计,格鲁吉亚也迫使高FM(PM)调制...
  10. 用 RxSwift 实现通用的响应式转场
  11. 20200224:跳跃游戏(leetcode55)
  12. 关于英语写作和阅读的学习——施一公教授的两篇博文
  13. XGBoost股票预测
  14. Ubuntu20.04+Window10双系统开机引导界面美化
  15. python修改快捷键_Pycharm快捷键设置 更换或者增添快捷键 设置字体放大缩小快捷键...
  16. 支付宝公布2019集五福攻略,准备好薅羊毛的正确姿势
  17. 【DDD设计】 Domain model VS DAL Entity VS Presentation DTO
  18. 程序员钱多多准备应聘拼多多
  19. 太子阿特士和公主哈娅·图芙丝之梦的故事(一)
  20. MODBUS通讯详解(博客园)

热门文章

  1. Golang 面试总结
  2. 1.3.2 常用内置函数
  3. 时间序列的期刊有哪些
  4. 旧计算机硬盘驱动器可以进口吗,旧的硬盘驱动器安全吗? | MOS86
  5. 猴子吃桃子(java_递归)
  6. 如何更准确的预估开发时间?
  7. HDU - 5265 pog loves szh II (二分或者贪心)
  8. Git使用命令行拉取项目、提交代码
  9. 如何给word文件自动添加目录?
  10. sslcontext java_java SSLContext