Мне нужно реализовать функцию, которая берет строку в качестве ввода и находит недвойный символ из этой строки.
Итак, пример: если я передаю строку str = "DHCD", он вернет "DHC" или str2 = "KLKLHHMO" он вернет "KLHMO"
Мне нужно реализовать функцию, которая берет строку в качестве ввода и находит недвойный символ из этой строки.
Итак, пример: если я передаю строку str = "DHCD", он вернет "DHC" или str2 = "KLKLHHMO" он вернет "KLHMO"
Подход Linq:
public static string RemoveDuplicates(string input)
{
return new string(input.ToCharArray().Distinct().ToArray());
}
Он выполнит работу
string removedupes(string s)
{
string newString = string.Empty;
List<char> found = new List<char>();
foreach(char c in s)
{
if(found.Contains(c))
continue;
newString+=c.ToString();
found.Add(c);
}
return newString;
}
Я должен отметить, что это преступно неэффективно.
Я думаю, что я был в бреду в первой ревизии.
Для произвольных строк длины символов размера байта (не для широких символов или других кодировок) я бы использовал таблицу поиска, по одному биту на символ (32 байта для 256-битной таблицы). Прокрутите строку, только выходные символы, которые не имеют своих битов, затем включите бит для этого символа.
string removedupes(string s)
{
string t;
byte[] found = new byte[256];
foreach(char c in s)
{
if(!found[c]) {
t.Append(c);
found[c]=1;
}
}
return t;
}
Я плохо разбираюсь в С#, поэтому я не знаю, как правильно использовать битовое поле вместо массива байтов.
Если вы знаете, что ваши строки будут очень короткими, тогда другие подходы будут лучше использовать память и/или скорость.
void removeDuplicate()
{
string value1 = RemoveDuplicateChars("Devarajan");
}
static string RemoveDuplicateChars(string key)
{
string result = "";
foreach (char value in key)
if (result.IndexOf(value) == -1)
result += value;
return result;
}
Это звучит как домашнее задание для меня, поэтому я просто опишу на высоком уровне.
Мой ответ на языке Java.
Проводятся здесь, чтобы вы могли получить представление, даже если он находится на языке Java. Алгоритм останется таким же.
public String removeDup(String s)
{
if(s==null) return null;
int l = s.length();
//if length is less than 2 return string
if(l<2)return s;
char arr[] = s.toCharArray();
for(int i=0;i<l;i++)
{
int j =i+1; //index to check with ith index
int t = i+1; //index of first repetative char.
while(j<l)
{
if(arr[j]==arr[i])
{
j++;
}
else
{
arr[t]=arr[j];
t++;
j++;
}
}
l=t;
}
return new String(arr,0,l);
}
//это в С#, валидация оставлена для краткости // примитивное решение для удаления повторяющихся символов из заданной строки
public static char[] RemoveDup(string s)
{
char[] c = new char[s.Length];
int unique = 0;
c[unique] = s[0]; // Assume: First char is trivial
for (int i = 1; i < s.Length; i++)
{
if (s[i-1] != s[i]
c[++unique] = s[i];
}
return c;
}
вы можете использовать HashSet:
static void Main()
{
string textWithDuplicates = "aaabbcccggg";
Console.WriteLine(textWithDuplicates.Count());
var letters = new HashSet<char>(textWithDuplicates);
Console.WriteLine(letters.Count());
foreach (char c in letters) Console.Write(c);
}
char * remove_duplicates (char * str) { char * str1, * str2;
if(!str)
return str;
str1 = str2 = str;
while(*str2)
{
if(strchr(str, *str2)<str2)
{
str2++;
continue;
}
*str1++ = *str2++;
}
*str1 = '\0';
return str;
}
char* removeDups(const char* str)
{
char* new_str = (char*)malloc(256*sizeof(char));
int i,j,current_pos = 0,len_of_new_str;
new_str[0]='\0';
for(i=0;i<strlen(str);i++)
{
len_of_new_str = strlen(new_str);
for(j=0;j<len_of_new_str && new_str[j]!=str[i];j++)
;
if(j==len_of_new_str)
{
new_str[len_of_new_str] = str[i];
new_str[len_of_new_str+1] = '\0';
}
}
return new_str;
}
Надеюсь, что это поможет
String str="AABBCANCDE";
String newStr="";
for( int i=0; i<str.length(); i++)
{
if(!newStr.contains(str.charAt(i)+""))
newStr= newStr+str.charAt(i);
}
System.out.println(newStr);
//Удалите оба верхних нижних дубликата
public static string RemoveDuplicates(string key)
{
string Result = string.Empty;
foreach (char a in key)
{
if (Result.Contains(a.ToString().ToUpper()) || Result.Contains(a.ToString().ToLower()))
continue;
Result += a.ToString();
}
return Result;
}
class Program
{
static void Main(string[] args)
{
bool[] doesExists = new bool[256];
String st = Console.ReadLine();
StringBuilder sb = new StringBuilder();
foreach (char ch in st)
{
if (!doesExists[ch])
{
sb.Append(ch);
doesExists[ch] = true;
}
}
Console.WriteLine(sb.ToString());
}
}
Console.WriteLine("Enter String");
string str = Console.ReadLine();
string result = "";
result += str[0]; // first character of string
for (int i = 1; i < str.Length; i++)
{
if (str[i - 1] != str[i])
result += str[i];
}
Console.WriteLine(result);
Мне нравится ответ Квинтин Робинсон, только должны быть некоторые улучшения, такие как удаление списка, потому что в этом случае это не обязательно. Кроме того, на мой взгляд, Uppercase char ( "K" ) и строчный char ( "k" ) - это одно и то же, поэтому их следует считать одним.
Итак, вот как я это сделаю:
private static string RemoveDuplicates(string textEntered)
{
string newString = string.Empty;
foreach (var c in textEntered)
{
if (newString.Contains(char.ToLower(c)) || newString.Contains(char.ToUpper(c)))
{
continue;
}
newString += c.ToString();
}
return newString;
}
Не уверен, насколько это оптимально:
public static string RemoveDuplicates(string input)
{
var output = string.Join("", input.ToHashSet());
return output;
}
Ниже приведен код для удаления повторяющихся символов из строки
var input = "SaaSingeshe";
var filteredString = new StringBuilder();
foreach(char c in input)
{
if(filteredString.ToString().IndexOf(c)==-1)
{
filteredString.Append(c);
}
}
Console.WriteLine(filteredString);
Console.ReadKey();
Демонстрация пространства имен {class Program {
static void Main(string[] args) { string myStr = "kkllmmnnouo"; Console.WriteLine("Initial String: "+myStr); // var unique = new HashSet<char>(myStr); HashSet<char> unique = new HashSet<char>(myStr); Console.Write("New String after removing duplicates: "); foreach (char c in unique) Console.Write(c); } } }
пересмотренная версия первого ответа на С# ниже
string oldstr = "abacab";
string newstr = новая строка (oldstr.Distinct(). ToArray());
var input1 = Console.ReadLine().ToLower().ToCharArray();
var input2 = input1;
var WithoutDuplicate = input1.Union(input2);