2015-05-09 67 views
0

我試圖解決下面的練習。我沒有收到任何編譯錯誤。給定兩個int數組,返回一個長度爲2的數組,其中包含從第一個和第二個數組中適合的數量

當我運行它雖然,在main方法只有第一Make2被調用,程序停止與該錯誤的工作:

The program '[4864] Make2Two.vshost.exe' has exited with code -1073741510 (0xc000013a).

有人能幫助我嗎?

有沒有更好的方法來解決問題?我認爲我放了太多不必要的代碼。

非常感謝。

問題:鑑於2個INT陣列,a和b,返回一個新的數組長度2含有 儘可能將適合,從一個元件,隨後從b中的元素。數組可以是任意長度,包括0,但是在2個數組之間將會有2個或更多元素可用。

我的代碼:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Make2Two 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Make2(new int[] { 4 }, new int[] { 4, 2, 3 }); //output 44 
      Make2(new int[] { 2, 3 }, new int[] { 2, 3, 6 }); //the others are not running 
      Make2(new int[] { 2, 5 }, new int[] { 7, 6, 5 }); 
     } 
     public static int[] Make2(int[] a, int[] b) 
     { 
      int[] result = new int[2]; 
      if (a.Length >= 2) 
      { 
       for (int i = 0; i < 2; i++) 
       { 
        result[i] = a[i]; 
        Console.Write(result[i]); 
       } 
       Console.WriteLine(); 
       Console.ReadLine(); 
      } 
      if (a.Length < 2) 
      { 
       for (int i = 0; i < 2; i++) 
       { 
        result[0] = a[0]; 
        if (i == 0) 
        { 
         for (int j = 1; j < 2; j++) 
         { 
          result[j] = b[j - 1]; 
          for (int k = 0; k < result.Length; k++) 
          { 
           Console.Write(result[k]); 
          } 
         } 
         Console.WriteLine(); 
         Console.ReadLine(); 
        } 
       } 
      } 
      return a; 
     } 
    } 
} 

回答

0

我認爲你是過於複雜了一點......

而且你的代碼是錯誤的:

result[0] = a[0]; 

你怎麼能肯定那a至少有一個元素?你應該檢查它!

讓我們嘗試以另一種方式:三個指標:i(的result指數),ai(的a指數),bi(的b指數)。我們總是增加i。當我們分別採用ab的元素時,我們增加aibi

public static int[] Make2(int[] a, int[] b) 
{ 
    int[] result = new int[2]; 

    for (int i = 0, ai = 0, bi = 0; i < result.Length; i++) 
    { 
     if (ai < a.Length) 
     { 
      result[i] = a[ai]; 
      ai++; 
     } 
     else if (bi < b.Length) 
     { 
      result[i] = b[bi]; 
      bi++; 
     } 
     else 
     { 
      break; 
     } 

     Console.Write(result[i]); 
    } 

    Console.WriteLine(); 

    return result; 
} 

另一種可能的解決方案。這裏我們有兩個for週期,一個用於a,另一個用於b。共享result的索引i

public static int[] Make2(int[] a, int[] b) 
{ 
    int[] result = new int[2]; 

    int i = 0; 

    for (int ai = 0; i < result.Length && ai < a.Length; i++, ai++) 
    { 
     result[i] = a[ai]; 
     Console.Write(result[i]); 
    } 

    for (int bi = 0; i < result.Length && bi < b.Length; i++, bi++) 
    { 
     result[i] = b[bi]; 
     Console.Write(result[i]); 
    } 

    Console.WriteLine(); 

    return result; 
} 

附錄:如果您想查詢你的算法工作,你應該檢查角落的情況下,如:

Make2(new int[] { }, new int[] { 1, 2 }); // output 12 
Make2(new int[] { 4, 5 }, new int[] { }); // output 45 
Make2(new int[] { 1 }, new int[] { 5 }); // output 15 

注意,在一般情況下,做到這一點寫應該分開計算和函數的功能,所以你應該從Make2中刪除所有Console.Write,並將它們放在一個單獨的方法中,應該由Main方法調用。

3

這個怎麼樣?

int[] a = new int[5]; 
int[] b = new int[5]; 

var result = a.Concat (b).Take (2).ToArray(); 

PS:會推薦閱讀LINQ(https://msdn.microsoft.com/en-us/library/bb397897.aspx

+0

哈哈,後期有點發布,但是,是這是後我會去用它。 –

+2

@xanatos閱讀練習。有2個元素可以保證:'數組可以是任意長度,包括0,但是在2個數組之間會有2個或更多元素可用' –

相關問題