首页 新闻 会员 周边

求C#算法 按照单词反转一句话。 最好有实际代码和讲解。

0
悬赏园豆:5 [已解决问题] 解决于 2012-07-20 17:54

例如:string str="My name is LiLei!";

得到的结果为"yM eman si !ieLiL"  

要求:最好不用分配新的内存空间。

aixuexi的主页 aixuexi | 菜鸟二级 | 园豆:210
提问于:2012-02-07 16:25
< >
分享
最佳答案
1
        [Fact]
public void WordsReverse()
{
StringBuilder str =new StringBuilder ( "Hello world!");
var cStack = new Stack<char>();
for (int i = 0, w = 0; i < str.Length; i++)
{
if (str[i] == ''||i==str.Length-1)
{
while (cStack.Count > 0)
{
str[w] = cStack.Pop();
w++;
}
w = i + 1;
}
else
{
cStack.Push(str[i]);
}

}
Console.WriteLine(str);
}

我的算法中没有分配新的存储空间,另外原始string的空间是没办法被再利用的,因为它是恒等的,当然作为考题不需要这么严格考虑。

收获园豆:5
today4king | 老鸟四级 |园豆:3499 | 2012-02-07 18:23
Stack<char> ,StringBuilder 不是新分配的空间?
水牛刀刀 | 园豆:6350 (大侠五级) | 2012-02-08 10:20

@水牛刀刀: 就知道你会这么说,我保留意见

today4king | 园豆:3499 (老鸟四级) | 2012-02-08 11:03

@水牛刀刀: 对了我想问问什么代码是不需要内存空间的?

today4king | 园豆:3499 (老鸟四级) | 2012-02-08 11:04
其他回答(4)
0

不分配新的内存空间是不可能的,因为这个过程中一定会产生新的字符串。从你的举例来看,你对“单词”的理解是按照空格分割的字符组合。

string str = "My name is LiLei!";
string[] words = str.Split(' ');
string result = string.Join(" ", words.Select(w => new string(w.Reverse().ToArray())));
水牛刀刀 | 园豆:6350 (大侠五级) | 2012-02-07 17:21

可以不用产生新空间的,其实这道题就是考的就是大学里的常识数组倒排~

支持(0) 反对(0) today4king | 园豆:3499 (老鸟四级) | 2012-02-07 18:22

@今昭: 怎么倒排,不需要临时空间吗?

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2012-02-08 10:40
0

string str = "My name is LiLei!";

-- 其实最主要的函数就是这个了,Split
string[] words = str.Split(' ');

string returnValue = string.empty;

for (int i=words.length; i>0; i--)

{

       returnValue += words[i];

       // Console.Write(words[i]);

}

Console.Write(returnValue);

通用C#系统架构 | 园豆:704 (小虾三级) | 2012-02-08 00:06

这还是新开辟内存了呀

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2012-02-08 10:43

我靠和尚,你这段程序啊能跑?

支持(0) 反对(0) today4king | 园豆:3499 (老鸟四级) | 2012-02-08 11:10

这个没翻转。。应该是returnValue+=words[i].Reverse();吧

支持(0) 反对(0) Rookier | 园豆:652 (小虾三级) | 2012-02-17 15:55
0

学习了。。。

KivenRo | 园豆:1734 (小虾三级) | 2012-03-02 23:11
0
//没弄算法,用C#自带函数也可以实现.
string str = "hello world!";
char[] str1= str.ToArray<char>();
Array.Reverse(str1);
string s = new string(str1);
string[] arr= s.ToString().Split(' ');
Array.Reverse(arr);
str= string.Join(" ", arr);
Console.WriteLine(str);
``炯`` | 园豆:4 (初学一级) | 2012-04-22 11:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册