陣列右移的一種較為高效的解決方法

2021-10-24 15:30:08 字數 1109 閱讀 7414

乙個陣列a中存有n(>0)個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移m(≥0)個位置,即將a中的資料由(a0a​1​​⋯a​n−1​​)變換為(a​n−m​​⋯a​n−1​​a​0​​a​1​​⋯a​n−m−1​​)(最後m個數迴圈移至最前面的m個位置)。如果需要考慮程式移動資料的次數盡量少,要如何設計移動的方法?

int

arrayshift

(int a,

int n,

int m )

;

其中a是使用者傳入的陣列;n是陣列的大小;m是右移的位數。函式arrayshift須將迴圈右移後的陣列仍然存在a中。

#include

#define maxn 10

intarrayshift

(int a,

int n,

int m )

;int

main()

printf

("\n");

return0;

}/* 你的**將被嵌在這裡 */

每個輸入包含乙個測試用例,第1行輸入n(1≤n≤100)和m(≥0);第2行輸入n個整數,之間用空格分隔。

在一行中輸出迴圈右移m位以後的整數序列,之間用空格分隔,序列結尾不能有多餘空格。

6 2

1 2 3 4 5 6

5 6 1 2 3 4

由於題目中說盡可能不用使用額外空間,並且盡量做到移動資料的次數少,所以我們採用讓需求的資料一次性到我們所需要的位置上。

int

arrayshift

(int a,

int n,

int m )

int k=n%m;

//判斷剩下的**中從**開始被打亂

if(k!=0)

k=m%k;

for(

;i)//開始將亂序前移

}}

總結:這次的**通過對空間使用情況的降低使用以及能夠將所需的資料僅僅通過了一次移動便能夠達到效果,通過對輸入函式的修正能夠完成陣列的左移。

一種較為便捷的快排寫法

思維 通過設定哨兵a low 從a low 1 到a high 依次與a low 進行比較,最終目的是使哨兵左邊部分元素都比哨兵元素小,右邊部分元素都比哨兵元素大。然後對左右兩部分分別進行遞迴呼叫,最終實現所有元素的排序。ps 此處是通過自增指標cur,將low之後比哨兵元素小的元素全部交換到前面部...

陣列類模板(上) 一種高效的使用

預備知識 模板引數可以是數值型引數 非型別引數 template void func func 數值型模板引數的限制 變數不能作為模板引數 變數是不能在編譯期就唯一確定的 浮點數不能作為模板引數 浮點數在計算機內部的表示是不精確的 類物件不能作為模板引數 本質 模板引數是在編譯階段被處理的單元,因此...

VMware 全屏問題 一種相對滿意的解決方案

缺點 1 這樣的全屏一方面 左右兩側的大小不能匹配 可以查查電腦顯示器的螢幕解析度 將虛擬機器中安裝的系統解析度調成和主機解析度一樣 2 螢幕有一些虛化 就像是 在電腦上將小放大看一樣 解決思路 遇到這種問題 首先我想到的是造成不能全屏的原因可能是 虛擬機器軟體vmware 也可能是裝上的linux...