1. 程式人生 > >[字串] 一個巧妙的字串迴圈移位法

[字串] 一個巧妙的字串迴圈移位法

給定一個長度為m的串,將其迴圈移位,向右移動n位,輸出迴圈移位後的字串:
例: m=7,n=3;
移動前:”1234567”
移動後:”5671234”

一個巧妙的辦法:
將給定的串分割成兩個串,長度分別為m-n和n,分別將其翻轉,翻轉後將其連線成一個串,再次翻轉,就得到了最終移動後的串!

“1234567”
“1234”,”567”
“4321”,”765”
“4321765”
“5671234”
字串X1部分為右移的n位字元(移位後在字元頭)
字串X2部分為剩下m-n位字元(移位後在字元尾)

本質上就是一個swap函式,從左到右經過兩次翻轉,就可以以翻轉的形式來調換相應的位置。

如果要向左移動,方法也完全相同,把X1的長度設為n,X2的長度設為m-n就可以
移動前:”1234567”
移動後:”4567123”

“1234567”
“123”,”4567”
“321”,”7654”
“3217654”
“4567123”

相關推薦

[字串] 一個巧妙字串迴圈移位

給定一個長度為m的串,將其迴圈移位,向右移動n位,輸出迴圈移位後的字串: 例: m=7,n=3; 移動前:”1234567” 移動後:”5671234” 一個巧妙的辦法: 將給定的串分割成兩個串,長度分別為m-n和n,分別將其翻轉,翻轉後將其連線成一

字串左旋--迴圈移位(c++實現)

#include<iostream> #include<string> using namespace std; //求最大公倍數gcd演算法 int gcd(int a,int b) { int c; while(b>0) { c

字串S1是否可以由字串S2通 過迴圈移位而得到

第一種方法是將 s2 的前 i 個位元組與 s2 的後 i 個位元組相比較,判斷是否相同,若相同,則再判斷 s2 的後 n-i 個位元組是否與 s1 的前 n-i 個位元組是否相同,若相同證明字串S1可以由字串S2通 過迴圈移位而得到,否則迴圈 i++ , 程式

【演算法】字串迴圈移位後是否包含

問題 給定兩個字串s1和s2,要求判斷s2是否能夠被通過s1做迴圈移位(rotate)得到的字串包含。 例如,s1=AABCD和s2=CDAA,返回true;給定s1=ABCD和s2=ACBD,返回false。 解法一 最直接最笨的方法就對s1進行迴圈移動,再

資料結構經典面試題:多種方法實現字串迴圈移位

來源:我是碼農,轉載請保留出處和連結! 本文連結:http://www.54manong.com/?id=12 問題描述:     要求在時間複雜度和空間複雜度分別為O(n)和O(1)的條件下把一個長度為N的字串迴圈左移M位,例如將長度為9的字串"12345

C語言:字串逆置(迴圈,遞迴寫法)

環境:Windows8,Visual Studio 2013 語言:C語言 字串逆置: 將一個一直字串的順序逆序排放保存於同一個空間內,長度,記憶體地址均不改變 方法一:

字串迴圈移位包含問題

#include <iostream> #include <string> #include <stdio.h> #include <time.h>

用Java自己寫一個反轉字串的方法

     關於反轉字串的方法,Java中的StringBuffer類中有現成的方法,自己寫一個是為了提高自己的程式設計能力。     挺簡單的,主要是用了String類的構造方法,Java的自動拆裝箱機制,剩下的就是基本的迴圈了,供朋友們參考

親和串 HDU - 2203 (KMP 迴圈移位一個串去匹配)

題意:  判斷P串是不是能和T串迴圈移位K位後的字串有匹配點 分析: 把T往自身後面貼一下變成TT,然後看P在TT中有沒有匹配點即可~~~ 這種往後帖一下的思想可以說是一種技巧,比如:求陣列挖去連續一塊後求剩下的有多少個不同的數. #include<b

CH1807 Necklace【Hash】【字串】【最小表示

1807 Necklace 0x18「基本資料結構」練習 背景 有一天,袁☆同學綿了一條價值連城寶石項鍊,但是,一個嚴重的問題是,他竟然忘記了項鍊的主人是誰!在得知此事後,很多人向☆同學發來了很多郵件,都說項鍊是自己的,要求他歸還(顯然其中最多隻有一個人說了真話)。 ☆同學要求每個人都寫了一段關

一個字串S和一個模式串P,要查詢P在S中的位置——KMP演算法

關鍵是求解NEXT陣列  Next陣列就是當前字元之前的字串中,有多大長度的相同字首與字尾 public class KMP { /** * KMP演算法的實現 */ /** * 求解NEXT陣列 */ private static void getNex

一個字串S和一個模式串P,要查詢P在S中的位置—暴力破解法

public class StringMatch { /** * 暴力匹配法 */ private static int StringMa(String s,String p){ int SLen = s.length(); int PLen = p.lengt

Python學習-第1課(變數,字串,運算子,迴圈

學習前準備~ 環境安裝:   Anaconda3+PyCharm python文件   python概述: 一、Hello world及註釋   二、變數 1. 命名規則: 變數命名可以包含數字,大小寫字母,下劃線 數字不可以在開頭 一般在pytho

需求說明:從鍵盤輸入一個字串,統計字串中每個字元的個數。如輸入“adbda”,結果為a=2,d=2,b=1。

思路: 使用Scanner接收鍵盤輸入的字串。 使用HashMap統計每個字元的個數,其中key儲存字元,value用來記錄字元的數量。 原始碼: public static void main(String[] args) { //人性化提示資訊。 System

給定一個字串,刪除字串中所有的b和ac組合, 要求:字串只遍歷一次,且不能使用額外的空間

string = 'aaascsscc' ls = list(string) def isA(ls): i = 0 while i < len(ls): if ls[i] == 'b': ls.pop(i) if i &g

arm 常數必須對應8 位點陣圖,即常數是由一個8 位的常數迴圈移位偶數位得到

在ARM指令集彙編碼碼中,32位有效立即數是通過 偶數位而間接得到的 在12位的shifter_operand中:8位存資料,4位存移位的次數。8位存資料:解釋了“該常數必須對應8位點陣圖”。 4位存移位的次數:解釋了為什麼只能移偶數位。4位只有16種可能值,而32位數可以迴圈移位32次(3

給定一個字串,在字串中找到第一個連續出現至少k次的字元。

#include<stdio.h> #include<string.h> int main() {int i,n,k,l=0; char a[80]; scanf("%d",&n); fflush(stdin); gets(a); k=strlen(a);

java字串常量池——字串==比較的一個誤區

轉自:https://blog.csdn.net/wxz980927155/article/details/81712342     起因 再一次js的json物件的比較中,發現相同

給定一個英文字串,請寫一段程式碼找出這個字串中首先出現三次的那個英文字元(需要區分大小寫)。 輸入描述:

題目描述 給定一個英文字串,請寫一段程式碼找出這個字串中首先出現三次的那個英文字元(需要區分大小寫)。 輸入描述: 輸入資料一個字串,包括字母,數字等。 輸出描述: 輸出首先出現三次的那個英文字元 示例1 輸入 Have you ever gone shopping