我必須用C語言解決它。我有 n 個整數的陣列。L 和 U 是下限和上限。我必須反轉[L,U]中的陣列中的數字。我通過這種方式嘗試過,但在某些情況下答案是錯誤的。代碼中有什么霧要改的?或者還有其他邏輯可以完成任務嗎?
#include <stdio.h>
int main() {
int x, arr[100], n, l, u, a, temp, temp1;
scanf("%d%d%d", &n, &l, &u);
for (int i = 0; i < n; i ) {
scanf("%d", &x); // read elements of an array
arr[i] = x;
}
a = n / 2;
for (int i = 0; i < a; i ) {
for (int j = a; j < n; j ) {
if (arr[i] >= l && arr[i] <= u) {
if (arr[j] >=l && arr[j] < u) {
temp = arr[j];
temp1 = arr[i];
arr[i] = temp;
arr[j] = temp1;
}
}
}
}
for (int i = 0; i < n; i ) {
printf("%d ", arr[i]);
}
}
樣本輸入:10(整數)-7(下限)5(上限)-10 -9 5 -2 -3 7 10 6 -8 -5
樣本輸出:-10 -9 -5 -3 -2 7 10 6 -8 5
我的輸出:-10 -9 -5 -2 -3 7 10 6 -8 5
uj5u.com熱心網友回復:
有一個O(N)不需要嵌套回圈的解決方案。
首先,使用您擁有的代碼,宣告一個附加陣列和一些其他幫助變數,以跟蹤需要交換的索引。
int left, right;
int swaplist[100] = {0};
int swapcount = 0;
您可以完全按照您的方式保持初始攝入回圈,但如果該值在下限和上限之間,則修改為將新掃描值的索引附加到陣列中。swaplist
for (int i = 0; i < n; i ) {
scanf("%d", &x); // read elements of an array
arr[i] = x;
if ((x >= l) && (x <= u)) {
swaplist[swapcount ] = i;
}
}
然后一個回圈遍歷“swaplist”并對原始陣列進行交換。
left = 0;
right = swapcount-1;
while (left < right) {
int leftindex = table[left];
int rightindex = table[right];
int tmp = arr[leftindex];
arr[leftindex] = arr[rightindex];
arr[rightindex] = tmp;
left ; right--;
}
uj5u.com熱心網友回復:
你做了一次勇敢的嘗試。您的嵌套for()回圈適用于某些排序演算法,但不適用于此任務的目的。
從樣本輸入和所需輸出中,您真的想在陣列的任一端建立一個“括號”,然后將兩者移向中心,交換其值恰好滿足
low <= n <= high值的元素。(在這種情況下,-7 <= n <= 5)。
這是一個解決方案:
#include <stdio.h>
int swap( int arr[], size_t l, size_t r ) { // conventional swap algorithm
int t = arr[l];
arr[l] = arr[r];
arr[r] = t;
return 1;
}
int main() {
int arr[] = { -10, -9, 5, -2, -3, 7, 10, 6, -8, -5, }; // your data
size_t i, sz = sizeof arr/sizeof arr[0];
for( i = 0; i < sz; i ) // showing original version
printf( "%d ", arr[i] );
putchar( '\n' );
#define inRange( x ) ( -7 <= arr[x] && arr[x] <= 5 ) // a good time for a macro
size_t L = 0, R = sz - 1; // 'L'eft and 'R'ight "brackets"
do {
while( L < R && !inRange( L ) ) L ; // scan from left to find a target
while( L < R && !inRange( R ) ) R--; // scan from right to find a target
} while( L < R && swap( arr, L, R ) && (L =1) > 0 && (R-=1) > 0 );
for( i = 0; i < sz; i ) // showing results
printf( "%d ", arr[i] );
putchar( '\n' );
return 0;
}
-10 -9 5 -2 -3 7 10 6 -8 -5
-10 -9 -5 -3 -2 7 10 6 -8 5
uj5u.com熱心網友回復:
如果我正確理解了賦值,則需要反轉滿足某些條件的陣列元素。
如果是這樣,那么這些嵌套的 for 回圈
for (int i = 0; i < a; i ) {
for (int j = a; j < n; j ) {
if (arr[i] >= l && arr[i] <= u) {
if (arr[j] >=l && arr[j] < u) {
temp = arr[j];
temp1 = arr[i];
arr[i] = temp;
arr[j] = temp1;
}
}
}
}
沒有意義。
僅使用一個 for 回圈就足夠了,如下面的演示程式所示。
#include <stdio.h>
int main( void )
{
int a[] = { 1, 10, 2, 3, 20, 4, 30, 5, 40, 6, 7, 50, 9 };
const size_t N = sizeof( a ) / sizeof( *a );
for (size_t i = 0; i < N; i )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
int l = 10, u = 50;
for (size_t i = 0, j = N; i < j; i )
{
while (i < j && !( l <= a[i] && a[i] <= u )) i;
if (i < j)
{
while (i < --j && !( l <= a[j] && a[j] <= u ));
if (i < j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
}
for (size_t i = 0; i < N; i )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
}
程式輸出為
1 10 2 3 20 4 30 5 40 6 7 50 9
1 50 2 3 40 4 30 5 20 6 7 10 9
您可以撰寫一個單獨的函式,例如
#include <stdio.h>
void reverse_in_range( int a[], size_t n, int low, int upper )
{
for (size_t i = 0, j = n; i < j; )
{
while (i < j && !( low <= a[i] && a[i] <= upper )) i;
if (i < j)
{
while (i < --j && !( low <= a[j] && a[j] <= upper ));
if (i < j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
i;
}
}
}
}
int main( void )
{
int a[] = { 1, 10, 2, 3, 20, 4, 30, 5, 40, 6, 7, 50, 9 };
const size_t N = sizeof( a ) / sizeof( *a );
for (size_t i = 0; i < N; i )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
reverse_in_range( a, N, 10,50 );
for (size_t i = 0; i < N; i )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
}
uj5u.com熱心網友回復:
感謝大家的幫助。我閱讀了所有這些,但我找到了解決這個問題的另一種方法。我會寫它以防萬一。(一些變數名稱是隨機的,所以如果有問題,請評論)。
#include <stdio.h>
int main() {
int x, main[100], n, l, u, a = 0, arr[100], temp, m = 0,f=0,c,d;
scanf("%d%d%d", &n, &l, &u);
for (int i = 0; i < n; i ) {
scanf("%d", &x); // read elements of an array
main[i] = x;
if (x >= l && x <= u) {
a ; //check if element is in range [l,u] and increasing a. later "a" will be used a length of the array "arr". this array cootains elements, which in in [u,l].
}
}
//add [u,l] elements in new array "arr"
for (int i = 0; i < n; i ) {
if (main[i] >= l && main[i] <= u) {
arr[m] = main[i];
m ; //index counter of "arr",
}
}
d=0;
for(int i=0;i<n;i ){
if(main[i]==arr[d]){
c=arr[a-d-1];
main[i]=c;
d ;
}
}
for(int i=0;i<n;i ){
printf("%d ",main[i]);
}
}
uj5u.com熱心網友回復:
我最好的猜測是 scanf 很煩人,最重要的是,您的格式不明確。
%d%d%d 將如何讀取 1234?它會給你 12 3 和 4 嗎?1 23 和 4?...
試著做
scanf("%d %d %d" ...); // or
scanf("%d, %d, %d" ...);
類似的東西。請注意,不建議使用 scanf,getc 是一個很好的替代方案,雖然當您想讀取多于一位的數字時也很煩人,但是您可以創建一個函式 read_number,它基于 getc,將讀取一個數字為一個字串并使用 stoi 回傳 int 值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/513785.html
標籤:数组Cfor循环if 语句撤销
上一篇:條件回圈重復列印錯誤輸出
