【算法】数组左旋、字符串左旋
什么是数组左旋?
数组左旋就是,对给定的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”
【算法】数组左旋、字符串左旋相关推荐
- DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总
DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台.刷题集合.问题为导向的十大类刷题算法(数组和字符串.栈和队列.二叉树.堆实现.图.哈希表.排序和搜索.动态规划/回溯法/递归/贪心/分治)总 ...
- 算法--------数组------反转字符串中的元音字母
编写一个函数,以字符串作为输入,反转该字符串中的元音字母.示例 1:输入: "hello" 输出: "holle" 示例 2:输入: "leetcod ...
- 字符串左旋右旋——三步旋转法和移相法
题目:实现一个函数,可以左旋字符串中的k个字符. AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA 方法一:三步旋转法 左旋程序思路:首先根据画图得知左旋后的结果,然后在分析 ...
- 剑指 offer set 19 翻转单词顺序 字符串左旋
题目 1. 翻转单词 student. a am I 转换成 I am a student. 2. 字符串左旋 abba 1 转成 bbaa 总结 1. 先对每个单词旋转, 再整齐旋转 2. 先翻转一 ...
- 【C/C++】左旋字符串
一.左旋 实现一个函数,可以左旋字符串中的k个字符. AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA 二.代码实现 (1)左旋n个字符得到的字符串 char* left_r ...
- 【C语言】实现一个函数,可以左旋字符串中的K个字符
题目说明: 要求实现一个函数,可以左旋字符串中的K个字符: 其中: ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 解法一: 解题思路: 拿到一组字符串之后,我们首先设置一个临时变 ...
- C语言题目:左旋字符串.
C语言题目:左旋字符串 两种方法: 方法一原理:把第一个元素放存放到某个变量,让除了第一个的元素全部向前移动一个索引,再把变量放到数组最后一个元素 实现: 方法二原理: 先让要左旋的那几个字符逆序,再 ...
- 【C语言】字符串加密解密,字符串左旋,杨氏矩阵,删除字符串中出现次数最少的字符
目录 1.字符串解密加密 2.字符串左旋 3.杨氏矩阵 4.删除字符串中出现次数最少的字符 好久不见,自从刷完剑指offer里面所有目前可以用C解决的题目吧之后,就在刷一些高校的题和华为机试题,一直在 ...
- C语言----字符串左旋
题目: 实现一个函数,可以左旋字符串中的n个字符. 例如 ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB #include <stdio.h> #include < ...
- java翻转单词顺序split_剑指offer解题报告(Java版)——翻转单词顺序 左旋字符串 42...
引言 这种翻转的问题会遇到很多,其实就是一个倒序的问题,对于第一个题只是想翻转单词的顺序,而并不想把整个字符串翻转了,如果完全翻转的话,比如I am a student.中所有字符翻转得到.tnedu ...
最新文章
- 针对抓win2003系统密码的诡计
- mysql语句中的sum(if(exp1,exp2,exp3))
- iterator与iterable
- 静态属性property的本质和应用
- 奇妙的棋盘(建图+搜索)
- vue打包后css路径_Vue打包后访问静态资源路径问题
- leetcode - 141. 环形链表(哈希表)
- PyQt5笔记(05) -- 绝对位置
- 微软自证开源决心:GitHub 私有库免费无限开放!
- python生成器表达式yield,面向过程编程,部分内置函数
- 服务器cpu最多几核心,决定虚拟服务器所需要的CPU核心数量是一件非常复杂的事情...
- DSP 2812: 使用C++封装SCI
- Codeforces Round #540 (Div. 3)--B. Tanya and Candies(前缀和的运用与变化)
- linux系统转移到另一个硬盘,(扩展根目录容量方法汇总)把Linux系统迁移到另一个分区或者硬盘...
- 一篇文章入门Python
- CPU虚拟化技术及QEMU/KVM虚拟机安装实践
- 关于用户表空间配额的问题
- Java 根据当前日期,获取到月初,和月底时间
- Word 项目文档排版
- 什么是字节码?采用字节码的最大好处是什么?