給定乙個長度為n的整數陣列a,元素均不相同,問陣列是否存在這樣乙個片段,只將該片段翻轉就可以使整個陣列公升序排列。其中陣列片段[l,r]表示序列a[l], a[l+1], ..., a[r]。原始陣列為
a[1], a[2], ..., a[l-2], a[l-1], a[l], a[l+1], ..., a[r-1], a[r], a[r+1], a[r+2], ..., a[n-1], a[n],將片段[l,r]反序後的陣列是
a[1], a[2], ..., a[l-2], a[l-1], a[r], a[r-1], ..., a[l+1], a[l], a[r+1], a[r+2], ..., a[n-1], a[n]。
示例如下:
要考慮陣列整體是公升序的,且陣列的任意兩個元素都不相同,而且是只有乙個片段翻轉就可以完成陣列的公升序排列。只要找到第乙個降序的子串行對它進行翻轉即可,如果翻轉後陣列有序則輸出yes,否者輸出no。
#include int main()
/* 找到需要翻轉的第乙個片段的左下標 */
x = a[0];
index = 0;
for(i = 1; i < n; i++)
else break;
} /* 找到需要翻轉的第乙個片段的右下標 */
x = a[index];
index2 = index;
for(i = index + 1; i < n; i++)
else break;
} /* 將找到的這個片段的元素進行翻轉 */
for(i = index, j = 0; i <= (index2+index)/2; i++, j++)
/* 判斷是否有奇異資料點,如果沒有應該一直找到陣列最後乙個元素的下標 */
x = a[0];
index = 0;
for(i = 1; i < n; i++)
else break;
} /* 判斷是否是最後乙個元素的下標 */
if(index == n-1)
fprintf(stdout, "yes");
else
fprintf(stdout, "no");
return 0;
}
賽碼 翻轉陣列
題目描述 給定乙個長度為n的整數陣列a,元素均不相同,問陣列是否存在這樣乙個片段,只將該片段翻轉就可以使整個陣列公升序排列。其中陣列片段 l,r 表示序列a l a l 1 a r 原始陣列為 a 1 a 2 a l 2 a l 1 a l a l 1 a r 1 a r a r 1 a r 2 a...
c語言實現螺旋陣列
螺旋陣列 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 分析 這是乙個一維維度和二維維度相等的陣列arr len len 將num 1開始從arr 0 0 賦值,直到num len len結束賦值。在賦值過程中,如...
C語言實現動態陣列
include include 要使用malloc是要包含此標頭檔案 include 要使用memset是要包含此標頭檔案 intmain for i 0 i 列印陣列 free p 釋放記憶體,malloc和free一定要記得成組使用,不然會導致程式吃記憶體 getchar 讓程式停頓,觀察輸出 ...