2010-10-22 35 views
5

Trong C# i muốn tạo logic rằng nếu chuỗi ia như abcabda được chuyển đến phương thức thì nó sẽ trả về ký tự không lặp lại đầu tiên từ chuỗi như trên nó sẽ trở lại c. tôi không thể chuyển đổi chuỗi thành mảng ký tự, sau đó cách so sánh từng ký tự mảng với chuỗi và trả về ký tự không lặp lại đầu tiên.C# logic để lấy ký tự đầu tiên không lặp lại (khác biệt) từ chuỗi

Tôi có thể làm như thế này không?

class A 
{ 
    static void main() 
    { 
     A a=new A(); 
     char ch=a.m1(abcabd); 
    } 
} 

class B 
{ 
    char m1(string s) 
    { 
     string s1=s; 
     char[] ch1=new char[s.length]; 
     for(int x=0; x<s.length;x++) 
     { 
      ch1[x]=s[x]; 
     } 
     for(int x=0; x<s.length; x++) 
     { 
      for(int y=0; y<s.lenth; y++) 
      { 
       if(s[x]=ch1[y]) 
       {    
/// here i am confused how to create logic for comparison please let me know 
// and how to return the character 
       } 
      } 
     } 
    } 
} 
+0

Tìm kiếm Google với điều này" Nhân vật trùng lặp trong chuỗi "dẫn đến trang này http://stackoverflow.com/questions/588774/how-to-remove-duplicate-characters-in-a-string –

+0

Nếu câu hỏi của bạn là" tôi có thể làm điều này ", tại sao không chỉ cần thử nó ra cho mình? Mã có làm những gì nó được cho là phải làm không? Tại sao bạn không thể chuyển đổi chuỗi thành một mảng ký tự? – HimBromBeere

Trả lời

3

Dưới đây là mã của bạn cho đến nay:

char m1(string s) 
{ 
    string s1=s; 
    char[] ch1=new char[s.length]; 
    for(int x=0; x<s.length;x++) 
    { 
     ch1[x]=s[x]; 
    } 
    for(int x=0; x<s.length; x++) 
    { 
     for(int y=0; y<s.lenth; y++) 
     { 
      if(s[x]=ch1[y]) 
      {    
/// here i am confused how to create logic for comparison please let me know 
// and how to return the character 
      } 
     } 
    } 
} 

Bạn đang thực sự khá chặt chẽ. Tôi sẽ bỏ qua tất cả các vấn đề về phong cách và dư thừa bởi vì chúng không phải là những gì bạn đang yêu cầu.

Điều bạn thực sự muốn làm là bước qua chuỗi ký tự từng ký tự của bạn và xem liệu ký tự đó có tồn tại sau này trong chuỗi hay không.Nếu nhân vật lặp lại, bạn có thể ngừng tìm kiếm nó và tiếp tục với nhân vật tiếp theo. Nếu bạn nhận được đến cuối chuỗi mà không tìm thấy một lặp lại, bạn đã tìm thấy một nhân vật không trùng lặp và có thể trả lại nó. Bạn có hầu hết các logic trong lồng nhau vòng x/y của bạn, nhưng đang thiếu một vài điều:

for(int x=0; x<s.length; x++) 
    { 
     // you need a flag here to indicate whether your character is a duplicate 
     for(int y=0; y<s.lenth; y++) // this loop should start at x+1, not 0 
     { 
      if(s[x]=ch1[y]) // you need == instead of = 
      {    
       // if you've gotten here, you have a duplicate -- 
       // set your flag to true and break out of the loop 
      } 
     } 
     // at this point you should check your flag and 
     // if it's not set, return your character: s[x] 
    } 

EDIT: Bạn nói rằng bạn muốn để có thể tìm thấy chiều dài của chuỗi mà không gọi Length, và có lẽ không đặt tên bất kỳ phương thức nào khác. Cách để làm điều này là sử dụng vòng lặp foreach để lặp qua các ký tự trong chuỗi, tăng bộ đếm khi bạn thực hiện. Dưới đây là một số mã với ý kiến ​​để bạn có thể điền vào:

// initialize counter to 0 
foreach (char ch in s) 
{ 
    // increment counter by 1 
} 
// now counter is the length of the string 
+0

đây là những gì tôi đã yêu cầu cảm ơn .. tôi cũng muốn tính toán chiều dài của chuỗi thay vì sử dụng s.length ... – NoviceToDotNet

+0

NoviceToDotNet: Tôi cập nhật câu trả lời của mình để cho bạn biết cách tính độ dài mà không sử dụng 's. Length' – Gabe

1

Để đọc từng ký tự trong chuỗi cũng đơn giản như:

foreach (Char character in myString) 
{ 

} 
+0

nhưng cách tạo logic so sánh? – NoviceToDotNet

+0

Tôi không viết logic của bạn cho bạn, không xứng đáng với -1 để được trợ giúp về cú pháp. – cjk

+0

+1 để giải quyết một trong các vấn đề của OP –

5

thế nào về việc sử dụng LINQ?

string test = "abcabda"; 

var selectedChars = (from c in test.ToCharArray() 
        group c by c into groups 
        where groups.Count() == 1 
        select groups).First(); 

Điều này sẽ trả về 'c' theo ví dụ được đưa ra trong câu hỏi.

+0

Tôi không chắc chắn rằng bạn sau đó tìm thấy ký tự * đầu tiên * duy nhất thay vì * một số * ký tự duy nhất. –

+0

Điều này trả về "abcd" thay vì chỉ c/d. –

2

"chuỗi" .ToCharArray() sẽ cung cấp cho bạn một mảng chứa ký tự mà làm cho "chuỗi"

2

Tôi nghĩ rằng bạn cần phải lặp hai lần qua danh sách các nhân vật:

  1. Khi xây dựng một Dictionary<char, int> của ký tự đếm,
  2. Sau đó, để tìm ra ký tự đầu tiên trong chuỗi mà đếm bằng 1
1

một khả năng giải pháp: lấy từng ký tự từ chuỗi từ phải sang trái. cho mỗi char, kiểm tra bất kỳ sự xuất hiện nào khác của ký tự trong chuỗi. nếu không có sự xuất hiện khác của char trong chuỗi, thêm nó vào một ngăn xếp. khi bạn đã thực hiện việc này cho tất cả các ký tự trong chuỗi, đầu ngăn xếp sẽ chứa ký tự không lặp lại đầu tiên.

+0

Tại sao không chỉ dừng lại khi bạn tìm thấy nhân vật đầu tiên thỏa mãn điều kiện? –

+0

bcos truyền tải ngược và yêu cầu là ký tự không lặp đi lặp lại đầu tiên..hope tôi rõ ràng là – Aadith

19

Dường như bạn đang tìm kiếm char đầu tiên trong chuỗi có số lượng bằng 1?

using System.Linq; 
string str = "abcabda"; 
char result = str.FirstOrDefault(ch => str.IndexOf(ch) == str.LastIndexOf(ch)); 

Non LINQ phiên bản:

for (int index = 0; index < str.Length; index++) 
    { 
     if (str.LastIndexOf(str[index]) == str.IndexOf(str[index])) 
     { 
      result = str[index]; 
      break; 
     } 
    } 
+0

không có phương thức thông minh nào được phép – NoviceToDotNet

+1

@Danny Chen: Đơn giản ... – Aamir

+1

@NoviceToDotNet: Đây không phải là phương pháp thông minh. Đây là LINQ rất đơn giản. Nếu bạn đang học .NET, bạn nên cân nhắc việc học LINQ như một phần thiết yếu của nó. Nó làm cho cuộc sống dễ dàng :) – Aamir

5

Khá đơn giản nhưng:

private char? findNonRepeat(string search) 
    { 
     foreach(char chr in search) 
     { 
      if (search.LastIndexOf(chr) == search.IndexOf(chr)) 
       return chr; 
     } 

     return null; 
    } 
+0

Tôi đã thay đổi phương thức vì tôi nhận ra nó chỉ được kiểm tra về phía trước. –

+0

Nếu không có LINQ được cho phép, đây thực sự là cược tốt nhất của bạn. Giải pháp khá gọn gàng! –

+0

@Jess: Không phải là tốt nhất. Sử dụng 'for-loop' thay vì' foreach', thì bạn không cần phải gọi 'search.IndexOf (chr)'. –

5

Bạn có thể sử dụng một chút LINQ:

char result = input 
    .GroupBy(c => c)    // group the characters 
    .Where(g => g.Count() == 1) // filter out groups with only 1 occurence 
    .Select(g => g.Key)   // get the character from each remaining group 
    .First();     // return the first one 
+0

không có phương thức thông minh nào được phép – NoviceToDotNet

+0

+1 cho phương pháp tốt nhất có mã tiệm cận và đẹp. Tôi nghĩ rằng bạn là O (n) trên trung bình (băm) trong khi những người khác là O (n^2). Và một điều nữa, điều này sẽ thất bại nếu không có. Tôi đoán 'FirstOrDefault' sẽ tốt hơn. –

2

này có thể không được nhiều nhất hiệu quả, nhưng nó hoạt động và dễ đọc:

public string FirstNonRepeatingChar(string inString) 
    { 
     var array = inString.ToCharArray(); 
     foreach (char distinctChar in array.Distinct()) 
     { 
      if (array.Count(x => x == distinctChar) == 1) 
       return distinctChar.ToString(); 
     } 
     return null; //none 
    } 
+0

Bạn không cần cuộc gọi 'ToCharArray'. Nó chỉ hoạt động giống nhau mà không có nó. – Gabe

+0

@Gabe - Tôi là trường cũ. Đôi khi tôi phải nắm bắt những ngón tay nhỏ xíu của tôi khi gõ một ĐTV. –

2

Đây là giải pháp của tôi

public static char FirstNonRepeatedChar(string input) 
    { 
     bool isDuplicate; 
     for (int i = 0; i < input.Length; i++) 
     { 
      isDuplicate = false; 

      for (int j = 0; j < input.Length; j++) 
      { 
       if ((input[i] == input[j]) && i !=j) 
       { 
        isDuplicate = true; 
        break; 
       } 

      } 
      if (!isDuplicate) 
      { 
       return input[i]; 
      } 

     } 
     return default(char); 

    } 
1

Ba cách để tìm kiếm nhân vật lặp lại không đầu tiên trong một chuỗi C#

tìm mã dưới đây -

public char firstNonRepetitive(string inputString) 
{ 
int nextOccurrence = 0; 
char firstDistinctChar = ' '; 
for (int i = 0; i < inputString.Length; i++) 
{ 
    nextOccurrence = 0; 
    for (int j = (i + 1); j < inputString.Length; j++) 
    { 
     if (inputString[i] == inputString[j]) 
      nextOccurrence++; 
    } 
    if (nextOccurrence == 0) 
    { 
     firstDistinctChar = inputString[i]; 
     break; 
    } 
    } 
    return firstDistinctChar; 

} 

Kiểm tra hai cách tuyệt vời -

program to find first non repeating character in a string c# - three ways

0

Đây là O (n) giải pháp cho vấn đề này.

public static char FirstNonRepeatedChar(string inputString) 
    { 
     if (String.IsNullOrEmpty(inputString)) 
      return '\0'; 
     if (inputString.Length == 1) 
      return inputString[0]; 

     Hashtable charTable = new Hashtable(); 
     for (int i = 0; i <= (inputString.Length - 1); i++) 
     { 
      if (charTable.Contains(inputString[i])) 
      { 
       int currentCount = Int16.Parse(charTable[inputString[i]].ToString()); 
       charTable[inputString[i]] = currentCount + 1; 
      } 
      else 
       charTable.Add(inputString[i], 1); 
     } 
     for (int i = 0; i <= (inputString.Length - 1); i++) 
     { 
      if (charTable[inputString[i]].ToString() == "1") 
      { 
       return char.Parse(inputString[i].ToString()); 
      } 
     } 
     return '\0'; 
    } 
+0

Có vẻ như điều này hy vọng từ điển để giữ thứ tự ban đầu của các phím được thêm vào, đó là [không đúng] (https://msdn.microsoft.com/en-us/library/xfhwa508 (v = vs.110) .aspx) : 'Với mục đích liệt kê, mỗi mục trong từ điển được coi là cấu trúc KeyValuePair biểu diễn một giá trị và khóa của nó. Thứ tự mà các mục được trả về là không xác định.' –

+0

Tôi đồng ý và ở đây có mã được cập nhật. –

0

Đây là một logic đơn giản để có được nhân vật không lặp lại đầu tiên từ một chuỗi

Ví dụ: AABBCCdEEfGG, đây là người đầu tiên không có char lặp đi lặp lại là "d"

namespace PurushLogics 
{ 
    class Purush_FirstNonRepeatingChar 
    { 
     public static void Main() 
     { 
      string inputString = "AABBCCdEEfGG"; 
      int i = 0; 
      char[] a = inputString.ToCharArray(); 
      bool repeat = false; 
      for (i = 0; i < a.Length;) 
      { 

       for (int j = i + 1; j < a.Length;) 
       { 
        if (a[i] == a[j]) 
        { 
         a = a.Where(w => w != a[i]).ToArray(); // Will return the array removing/deleting the character that is in a[i] location 
         repeat = true; 
         break; 
        } 
        else 
        { 

         repeat = false; 
        } 

        break; 
       } 

       if (repeat == false || a.Length == 1) 
       { 
        break; 
       } 
      } 
      Console.WriteLine(a[i]); 
      Console.ReadKey(); 
     } 
    } 
} 
Các vấn đề liên quan