昨天微软的一个笔试题,大家讨论下

questionofms 2007-03-23 10:19:50
有字符串如"ABCD,BDAC,DRF,FRD,CADB,CAADB,XB",要将其中由相同字符组成的词归在一起,如果没有和其由相同字符组成的词则去掉,如上的结果为:
组1:ABCD,BDAC,CADB
组2: DRF,FRD
另外,CAADB和XB去掉
请写出代码(c#),思路和选择所使用的数据结构的原因
...全文
1143 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
林初茵 2008-10-07
  • 打赏
  • 举报
回复
mark
x63403262 2007-03-25
  • 打赏
  • 举报
回复
有个比较简单的方法就是将
ABCD,BDAC,DRF,FRD,CADB,CAADB,XB里的每个单次进行排序结果为
ABCD,ABCD,DFR,DFR,ABCD,AABCD,BX,然后做字符串比较
不知道大家有没更简单的方法
wzhh1988 2007-03-23
  • 打赏
  • 举报
回复
学习....
questionofms 2007-03-23
  • 打赏
  • 举报
回复
谢谢大家,结帖给分
真相重于对错 2007-03-23
  • 打赏
  • 举报
回复
sort 一下
就出来了
questionofms 2007-03-23
  • 打赏
  • 举报
回复
不过csShooter(Sharp Shooter)没把孤儿词给去掉。。。。。。
questionofms 2007-03-23
  • 打赏
  • 举报
回复
对,csShooter(Sharp Shooter) 的sort()后再tostring()再判断是方便多了
public static string OrderWord(string _source)
{
char[] temp = _source.ToCharArray();
Array.Sort(temp);
return temp.ToString();
}
questionofms 2007-03-23
  • 打赏
  • 举报
回复
哇,skywind_jk(天风)的这个算法不错
static bool RightOP(string str1, string str2)
{
// 字串长度判断
if (str1.Length != str2.Length)
return false;

foreach (char ch in str1.ToCharArray())
{
// 是否包含字符的判断
if (str2.IndexOf(ch) < 0)
return false;

// 判断该字符个数是否一致。过滤如ABB 和AAB这种情况
if (str1.Replace(ch.ToString(), "").Length != str2.Replace(ch.ToString(), "").Length)
return false;
}

// compare one by one
return true;
}
yucong 2007-03-23
  • 打赏
  • 举报
回复
我的思路是,分组排序,然后比较字符串是否相等.
ty
jackyped 2007-03-23
  • 打赏
  • 举报
回复
呵呵
会写和写好的对比了
questionofms 2007-03-23
  • 打赏
  • 举报
回复
大家好厉害,挨个学习先。。。。
王集鹄 2007-03-23
  • 打赏
  • 举报
回复
思路:
选择字符串和字符串列表
将单词排序作为关键字放在字符串的首部
判断一个单词是否列表中,就是将其排序后对列表的首部进行比较
中途结果如下
ABCD=ABCD,BDAC,CADB
DFR=DRF,FRD
AABCD=CAADB
BX=XB
其中没有出现“,”号说明没有重复
------------
string vText = @"ABCD,BDAC,DRF,FRD,CADB,CAADB,XB";
List<string> vResults = new List<string>();
string[] vWords = vText.Split(",".ToCharArray(),
StringSplitOptions.RemoveEmptyEntries);
foreach (string vWord in vWords)
{
char[] vChars = vWord.ToUpper().ToCharArray();
Array.Sort(vChars);
string T = new string(vChars);
bool vExists = false;
for (int i = 0; i < vResults.Count; i++)
if (T + "=" == vResults[i].Substring(0, T.Length + 1))
{
vResults[i] += "," + vWord;
vExists = true;
break;
}
if (!vExists) vResults.Add(T + "=" + vWord);
}
int vGroup = 0;
foreach (string vResult in vResults)
{
if (vResult.IndexOf(',') > 0)
{
vGroup++;
textBox1.AppendText(string.Format("组{0}: {1}\r\n",
vGroup, vResult.Substring(vResult.IndexOf('=') + 1)));
}
}
-----
组1: ABCD,BDAC,CADB
组2: DRF,FRD
Red_angelX 2007-03-23
  • 打赏
  • 举报
回复
也 only顶一下
csShooter 2007-03-23
  • 打赏
  • 举报
回复
static void Main(string[] args)
{
string source = "ABCD,BDAC,DRF,FRD,CADB,CAADB,XB";
string[] arraySource = source.Split(',');
GetMaxMin(arraySource);
Console.Read();
}

//public static string[][] GetFirtTime(string[] source)
//{
// // string[][] temp = new string[source.Length,3];
//}

/// <summary>
///
/// </summary>
/// <param name="source"></param>
public static void GetMaxMin(string[] source)
{
//第一轮判断
//string[] needTemp = new string[source.Length];
string _strTemp;
for (int i = 0; i < source.Length; i++)
{
_strTemp = source[i];
if (source[i] == "")
continue;
Console.Write( "\n"+ _strTemp + "\t");
for (int n = i+1; n < source.Length; n++)
{
if (_strTemp.Length == source[n].Length)
{
if (OrderWord(_strTemp) == OrderWord(source[n]))
{
Console.Write(source[n] + "\t");
source[n] = "";
}
}
}
}

}

/// <summary>
/// order word
/// </summary>
/// <param name="_source"></param>
/// <returns></returns>
public static string OrderWord(string _source)
{
char[] temp = _source.ToCharArray();
Array.Sort(temp);
return temp.ToString();
}
skywind_jk 2007-03-23
  • 打赏
  • 举报
回复
一段Code,欢迎指正.
class Program
{
static void Main(string[] args)
{
List<string> list = Start("ABCD,BDAC,DRF,FRD,CADB,CAADB,XB,ABB,BAA"); // ABB,BAA是我测试加的

foreach (string str in list) // 输出结果
Console.WriteLine(str);
}

static List<string> Start(string oriString)
{
string[] oriList = oriString.Split(','); // 原始记录,分成 []
List<string> resultList = new List<string>(); // 记录结果
bool[] flags = new bool[oriList.Length]; // 用于记录比较状态
for (int i = 0; i < flags.Length; i++)
flags[i] = false;

for (int i = 0; i < oriList.Length; i++)
{
if(flags[i])
continue;

string result = ""; // 存放结果(单条)

// 比较后面的是否同当前(i) “相同”
for (int j = i + 1; j < oriList.Length; j++)
{
if (flags[j])
continue;

if (RightOP(oriList[i], oriList[j]))
{
result += "," + oriList[j];
flags[j] = true;
}
}

if (result != "")
{
flags[i] = true;
resultList.Add(oriList[i] + result);
}
}
return resultList;
}
// 字符比较
static bool RightOP(string str1, string str2)
{
// 字串长度判断
if (str1.Length != str2.Length)
return false;

foreach (char ch in str1.ToCharArray())
{
// 是否包含字符的判断
if (str2.IndexOf(ch) < 0)
return false;

// 判断该字符个数是否一致。过滤如ABB 和AAB这种情况
if (str1.Replace(ch.ToString(), "").Length != str2.Replace(ch.ToString(), "").Length)
return false;
}

// compare one by one
return true;
}
}
questionofms 2007-03-23
  • 打赏
  • 举报
回复
果然我昨天的代码有问题
我想把"ABCD,BDAC,DRF,FRD,CADB,CAADB,XB"转化为ArrayList后做判断,并把判断完的删除
可是删除后报错“System.NotSupportedException ”
即:如果ArrayList为只读,或者有固定大小将会引发此异常。

之前代码是:
string input = "ABCD,BDAC,DRF,FRD,CADB,CAADB,XB";
string[] s = input.Split(',');
ArrayList al1 = ArrayList.Adapter(s);
al1.RemoveAt(0);

要如何让al1可删除呢?
jetxia 2007-03-23
  • 打赏
  • 举报
回复
晕 我理解错了
ylqmf 2007-03-23
  • 打赏
  • 举报
回复
Zine_Alone(*小飞*) ( ) 信誉:100 Blog 2007-03-23 10:41:28 得分: 0


思路:
1.将字符串转换为ASICC值.
2.比较ASICC值,相通的则为解,反之则去除掉.

部分代码:

string str = "ABCD,BDAC,DRF,FRD,CADB,CAADB,XB";
ArrayList arrayList=new ArrayList();
long lg;
string[] arry = str.Split(',');
foreach (string value in arry)
{
lg = 0;
foreach (char ch in value)
{
lg += (int)ch;
}
arrayList.Add(lg);
}
下略.
..........................
..........................
------------------------------------------
不同意使用 ArrayList 。应该用最基本的数组。

jetxia 2007-03-23
  • 打赏
  • 举报
回复
个人思路
1、用split分割 "ABCD,BDAC,DRF,FRD,CADB,CAADB,XB" 得到 数组arr1;
2、在循环把arr1中每个字符串进行排序;(排序算法是影响效率得关键)
3、定义一个SortedList,循环把arr1中得字符串加进去(进去得时候判断是否已经存在)
questionofms 2007-03-23
  • 打赏
  • 举报
回复
我想的是把每个词转化为char数组,然后做个Sort,再比较
加载更多回复(28)

111,119

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧