什么是数组左旋?

数组左旋就是,对给定的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. 针对抓win2003系统密码的诡计
  2. mysql语句中的sum(if(exp1,exp2,exp3))
  3. iterator与iterable
  4. 静态属性property的本质和应用
  5. 奇妙的棋盘(建图+搜索)
  6. vue打包后css路径_Vue打包后访问静态资源路径问题
  7. leetcode - 141. 环形链表(哈希表)
  8. PyQt5笔记(05) -- 绝对位置
  9. 微软自证开源决心:GitHub 私有库免费无限开放!
  10. python生成器表达式yield,面向过程编程,部分内置函数
  11. 服务器cpu最多几核心,决定虚拟服务器所需要的CPU核心数量是一件非常复杂的事情...
  12. DSP 2812: 使用C++封装SCI
  13. Codeforces Round #540 (Div. 3)--B. Tanya and Candies(前缀和的运用与变化)
  14. linux系统转移到另一个硬盘,(扩展根目录容量方法汇总)把Linux系统迁移到另一个分区或者硬盘...
  15. 一篇文章入门Python
  16. CPU虚拟化技术及QEMU/KVM虚拟机安装实践
  17. 关于用户表空间配额的问题
  18. Java 根据当前日期,获取到月初,和月底时间
  19. Word 项目文档排版
  20. 什么是字节码?采用字节码的最大好处是什么?

热门文章

  1. Tomcat调优教程
  2. 中科大失联博士:微信仅有5个好友 最近一年比较颓废
  3. im即时通讯开发:群消息推送如何保证实时性
  4. centos7 ssh配置
  5. 【SPFA,dp】黑心商店2
  6. oracle中时间格式的写法,Oracle中时间的格式
  7. 用计算机用语说唯美的话,一句话心情说说唯美句子
  8. oracle的创建视图,Oracle笔记:创建视图
  9. 一级计算机证书有用吗?
  10. 把 ChatGPT 微信机器人一键部署到免费服务器!