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