2016-08-05 18 views
1

Grrrr Ich habe C# und mehrdimensionale Arrays. Aus irgendeinem Grund, der aus einem C/C++ - Hintergrund kommt, ärgern sie mich wirklich.Wie kann man ein 26x2-Array definieren und dann LINQ in seinen Zeilen verwenden?

Also, wenn ich

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
class Solution 
{  
    static void Main(String[] args) 
    { 
     int T = Int32.Parse(Console.ReadLine()); 
     for(int t = 0; t < T; ++t) 
     { 
      string str = Console.ReadLine(); 
      if(str.Length % 2 == 1) 
      { 
       Console.WriteLine(-1); 
       continue; 
      } 
      int n = str.Length/2; 
      // determine how many replacements s1 needs to be an anagram of s2 
      string s1 = str.Substring(0, n); 
      string s2 = str.Substring(n, n); 
      int[][] counter = new int[26][2]; 
      int ascii_a = (int)'a'; 
      for(int i = 0; i < n; ++i) 
      { 
       counter[(int)s1[i] - ascii_a][0] += 1; 
       counter[(int)s2[i] - ascii_a][1] += 1; 
      } 
      int count = counter.Select((pair => Math.Abs(pair[0] - pair[1]))).Sum(); 
      Console.WriteLine(count); 
     } 
    } 
} 

laufen ich

solution.cs (22,42): Fehler CS0029: Kann nicht implizit Typ int' to int [] []‘Compilation fehlgeschlagen konvertieren: 1 Fehler, 0 Warnungen

Keine Ahnung warum.

Ich kann es ändern zu

 int[,] counter = new int[26,2]; 
     int ascii_a = (int)'a'; 
     for(int i = 0; i < n; ++i) 
     { 
      counter[(int)s1[i] - ascii_a, 0] += 1; 
      counter[(int)s2[i] - ascii_a, 1] += 1; 
     } 
     int count = counter.Select((pair => Math.Abs(pair[0] - pair[1]))).Sum(); 

aber dann, natürlich, meine LINQ-Anweisung bricht.

+0

'Select ((pair =>' -?. Warum zweiten '(' 'vor pair' In welcher Zeile Sie Fehler erhalten – Sinatr

+0

@ user6048670 hinzugefügt meine Version von Antwort, die mit OP richtet tatsächlich – uTeisT

Antwort

2

Wenn Sie

 int[][] counter = new int[26][2]; 

zu

 int[][] counter = new int[26][]; 
     for (int i = 0; i < counter.Length; i++) 
      counter[i] = new int[2]; 
ändern

Code kompiliert. Sie können den Rest nach Belieben testen. Da Sie im OP keine notwendigen Eingaben gemacht haben.

1

Was Sie verwenden, hier ist ein verzweigtes Array, und Sie können nicht new man wie folgt aus:

int[][] counter = new int[26][2]; 

Sie haben separat die innere Array zu deklarieren:

int[][] counter = new int[26][]; 
for (int i = 0; i < 26; i++) 
{ 
    counter[i] = new int[2]; 
} 

Alternativ, wie @IvanStoev vorgeschlagen hat, können Sie auch einen LINQ one-Liner verwenden:


Sie können auch einen 2-dimensionalen Array, wie diese verwenden:

// notice there is only one bracket 
int[,] counter = new int[26,2]; 
int ascii_a = (int)'a'; 

for(int i = 0; i < n; ++i) 
{ 
    counter[(int)s1[i] - ascii_a, 0] += 1; 
    counter[(int)s2[i] - ascii_a, 1] += 1; 
} 

// and, you will need to update your query, 
// as linq would implicitly flatten the array 
var count = Enumerable.Range(0, 26) 
    .Select(x => counter[x, 0] - counter[x, 1]) 
    .Sum(); 
+2

Sie können‘ t Weisen Sie foreach Iterationen einen Wert zu, dh in diesem Fall ein Paar, aber Sie könnten so etwas versuchen: 'int [] [] counter = new int [26] []; für (int i = 0; i uTeisT

+1

@uteist Korrekt. Oder initialisiere es mit einem LINQ one liner wie' var counter = Enumerable .Range (0, 26) .Wählen Sie (_ => new int [2]). ToArray(); ':) –

+0

@uteist Danke, dass Sie darauf hingewiesen haben. – Xiaoy312

0

Ich würde vorschlagen, eine Counter-Struktur zu definieren, dann verwenden Sie ein Array von denen anstelle eines mehrdimensionalen Array.

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
class Solution 
{ 
    struct Counter 
    { 
     public int c1; 
     public int c2; 
    } 

    static void Main(String[] args) 
    { 
     int T = Int32.Parse(Console.ReadLine()); 
     for (int t = 0; t < T; ++t) 
     { 
      string str = Console.ReadLine(); 
      if (str.Length % 2 == 1) 
      { 
       Console.WriteLine(-1); 
       continue; 
      } 
      int n = str.Length/2; 
      // determine how many replacements s1 needs to be an anagram of s2 
      string s1 = str.Substring(0, n); 
      string s2 = str.Substring(n, n); 
      Counter[] counter = new Counter[26]; 
      int ascii_a = (int)'a'; 
      for (int i = 0; i < n; ++i) 
      { 
       counter[(int)s1[i] - ascii_a].c1 += 1; 
       counter[(int)s2[i] - ascii_a].c2 += 1; 
      } 
      int count = counter.Select((pair => Math.Abs(pair.c1 - pair.c2))).Sum(); 
      Console.WriteLine(count); 
     } 
    } 
}