2011-08-07 2 views
0

で複製:削除は、私は面接の技術テストの準備をしていると私はこの質問に出くわした文字列

バッファを使用せず、文字列内のすべての重複を削除し、1または2の追加変数が許可されます。

以下のことを知りたいと思いますが、私はバッファを使用していますか?ありがとう。

static void Main(string[] args) 
{ 
    string temp = "amanisaman"; 
    temp = noDups(temp); 
    MessageBox.Show(temp); 
} 

public string noDups(string word) 
{ 
    string table = ""; 

    foreach (var character in word) 
    { 
     if (table.IndexOf(character) == -1) 
     { 
      table += character; // would this count as a buffer storage? 
     } 
    } 
    return table; 
} 
+1

以上のC質問状C#ものよりも見えます。 –

+0

私の意見では、あなたの例の変数テーブルは、あなたが記憶装置に使用している一時変数であるため、バッファとしてカウントされます。 @ jalospinosoはちょうどLinqを使って上品な方法であなたの質問を解決しました – Icarus

+0

@ Sergeなぜですか? C#プログラマーはこれを行うことができませんか? –

答えて

3

使用LINQ;

これはあなたの一時文字列を想定して、あなたは、これはあなたが重複した単語を削除することを前提としていた文字

string originalString = "amanisaman"; 
string newString = string.Join(" ", originalString.ToCharArray().Distinct()); 

を削除したいです。

string originalString = "this is my test string here, this test"; 
string newString = string.Join(" ", originalString).Split(new Char[] {' '}).Distinct()); 
+1

Distinctは、作業を行うために 'Set <>'(本質的には、 'HashSet <>'の 'internal'バージョン)を使います。私はそれが "バッファなし"の基準を満たしているのではないかと疑います(ただし、バッファがないことを意味していない限り!) – dlev

+0

fair point :) string.Joinはおそらくバッファも使用します。 – iain

+0

ところで、引数をとらない['String.ToCharArray'](http://msdn.microsoft.com/en-us/library/ezftk57x.aspx)オーバーロードがあります。ここに。 – Richard

1

ありあなたが投稿したコードのエラー数は、(それをコンパイルしてみてください!)ですが、次のようなアプローチは、Stringクラスに拡張メソッドを作成することで動作します:C#で

static class Program 
{ 
    static void Main(string[] args) 
    { 
     String temp = ("amanisaman"); 
     Console.WriteLine(temp.RemoveDupes()); 
     Console.ReadLine(); 
    } 
    static String RemoveDupes(this String x) 
    { 
     return String.Join("", x.Distinct()); 
    } 
} 
+0

関数のコンストラクタで 'this'キーワードを参照するのはなぜですか? –

+1

これは拡張メソッド(http://msdn.microsoft.com/en-us/library/bb383977.aspx)と呼ばれ、関数呼び出しを本当に滑らかにします。もちろん、関数の中身を取り出して、それを1つのライナーにすることができます:String.Join( ""、temp.Distinct()) – D3C34C34D

1

ストリングス不変です。したがって、あなたは "安全でない"ことに気づかない限り、バッファである何らかの方法で別のメモリ位置を割り当てる必要があります。

この質問は実際に正しい答えと同じくらいコード回答を探しているわけではないかもしれません.C#では「安全でない」場合を除き、これは不可能です。

0

[&hellip;]バッファを使用せずに、1つまたは2つの追加の変数を使用できます。彼らはおそらくそれによって何を意味

あなたのソリューションではなく、入力文字列の長さに比例成長するメモリの量を使用するのでは、関係なく、あなたがそれを供給しているものを入力、メモリの一定量を使用するべきではないということです。言い換えれば、あなたの解はO(n)ではなくO(1)というメモリ要件を持つ必要があります。

あなたのtableは「バッファ」としてカウントされていると思います。最大容量は(Unicode)アルファベットの文字数によって決まりますが、tableには入力文字列—と同じ量の文字が含まれている可能性があります。つまり、入力に重複する文字がない場合です。

noDupsという具体的な方法について言えば、あなたはtableという名前のデータを使用しているに過ぎませんが、それは何も使用していないようです。あなたの質問は単に蒸発するだけです。

2

これは、文字列内に同じ文字が存在する場合、インデックスは永遠に同じだからです。 これを試してみてください:

static string noDups(string word) 
     { 
      string table = ""; 
      int pos = 0; 
      foreach (var character in word.ToCharArray()) 
      { 
       pos = table.IndexOf(character, Math.Abs(pos)); 
       if (pos == -1) 
       { 
        table += character; 
       } 


      } 
      return table; 

     } 

私はこのため.IndexOf方法は良いアイデアではないと思われます。 .ContainsメソッドまたはLINQを使用できます。

使用LINQは:

string input = "abahehe"; 
string output = new String(input.ToCharArray().Distinct().ToArray()); 
-2

はいテーブルは、バッファとしてカウントされます。

文字列が不変であり、削除(または追加)が行われると、バッファと見なすことができる新しい文字列が作成されます。

私は次のことを行うと、余分なメモリを最小限に抑えるために:

string s = "ababagalamaga"; 
var h = new HashSet<char>(s); 
var b = new StringBuilder(); 
foreach (char ch in h) { 
    b.Append(ch); 
} 
Console.WriteLine(b); 
+0

??? downvoter - 説明してください! –

-2

「バッファを使用しないが、」本当に悪いの要件です。どういう意味ですか?新しい文字列はバッファーですか?この要件の解釈に応じて、C#での割り当ては非常に簡単で不可能です。

0

O(n)の溶液:

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 

void removeDuplicates(char *); 

void removeDuplicates(char *inp) 
{ 
     int i=0, j=0, FLAG=0, repeat=0; 

    while(inp[i]!='\0') 
    { 
      if(FLAG==1) 
      { 
        inp[i-repeat]=inp[i]; 
      } 
      if(j==(j | 1<<(inp[i]-'\0'))) 
      { 
        repeat++; 
        FLAG=1; 
      } 
        j= j | 1<<(inp[i]-'\0'); 
        i++; 
    } 

    inp[i-repeat]='\0'; 
} 

int main() 
{ 
    char inp[100] = "aaAABCCDdefgccc"; 
    //char inp[100] = "ccccc"; 
    //char inp[100] = "\0"; 
    //char *inp = (char *)malloc(sizeof(char)*100); 

    printf (" INPUT STRING : %s\n", inp); 

    removeDuplicates(inp); 

    printf (" OUTPUT STRING : %s:\n", inp); 
    return 1; 
} 
関連する問題