发表评论
#2楼 [
楼主]2005-04-14 16:20 |
reverse(word);
this is in c#
#4楼 [
楼主]2005-04-14 16:57 |
同迟方兄提出的一样,要注意in place,在有限的空间里完成,如果这不只是一个句子,而是一篇文章,那行你用split()生成的数组的下标会是多少呢?太大了,就不是在有限的空间里完成了,这里强调的是in place,也就是对句子本身做处理。
既然是 in place, 就应该用 StringBuilder.
另外临时存储量为一个单词也太多了.
#7楼 [
楼主]2005-04-15 11:47 |
都是强人呀!
in place就是表明在转换时不能把句子中的任何内容导出到别的内存空间,因此楼上的贴子全是错解。其实这个问题只是另一个问题的变型而已:就是如果有两个变量,如何不借助中间变量而将两个变量的值交换。这是个很经典的C面试题,会做这个则本题轻而易举能解的出来
那也应该用char[] 数组而不能用 string
#12楼 [
楼主]2005-04-18 10:13 |
@junk
如果这只是两个变量不用中间变量的转换,那么第二个变量怎么得到?并没有直接给出,在这里你要得到第二个变量,就不得不使用中间量了!
不是吧??我用C++给你写一个标准的:
#include <iostream>
using namespace std;
int main()
{
char *ps = new char[15];
strcpy(ps,"I am yuchifang");
cout<<"before reverse:"<<endl;
cout<<ps<<endl;
int i=0;int j=13;
while(i<j)
{
ps[i] = ps[i]+ps[j];
ps[j] = ps[i]-ps[j];
ps[i] = ps[i]-ps[j];
i++;
j--;
}
cout<<"after reverse"<<endl;
cout<<ps<<endl;
}
你还可以用异或之类的操作。
这里只用了下标index.没有任何中间用于存储的变量,你说哪种解法有说服力?
其实你还可以用异或的
其实说白了就是,交换两个变量a、b,如何不借助于中间变量:方法就是:
a=a+b;
b=a-b;
a=a-b;
Ninputer的方法是
a=a^b;
b=b^a;
a=a^b
支持junk
这样才符合"in place"的要求,楼主的做法离要求还是略有偏差
String[] str = new String[]{"I am yuchifang"};
str = str[0].Splite(" ");
for (int i = 1; i <= str.Length; i++)
{
Console.Write(str[str.lenght - i]);
if (i < str.Length)
Console.Write(" ");
}
#18楼 [
楼主]2005-06-14 08:18 |
@whxbb
如果像你写的这样,当然很明了简单,不过就离题了,弄出一个字符串数组来,如果不只是一个这样的句子的处理,而是一本书呢?那你这个数组会有多大?完全不是“in place”的意思了!可以看一下前面的朋友的讨论!
各位兄弟,这个函数如果用split来做的话,虽然句子很短,但会忽视有一种情况,那就是字符串的两头如果是" "的话,转换后无法现实,而且效率较差。我是用c#的,也根据这个编了个函数,代码如下:
public static string Replace(string s)
{
char[] word;
char[] sChar=s.ToCharArray();
int n=s.Length;
int index=0;
int last=n-1;
string str="";
for(int i=n-1;i>=0;i--)
{
if(sChar[i]!=' ')
{
index++;
if(last-index<0)
{
word=new char[last+1];
for(int j=0;j<=last;j++)
{
word[j]=sChar[j];
}
str+=new string(word);
return str;
}
}
else
{
word=new char[index+1];
int w=0;
for(int j=last-index+1;j<=last;j++)
{
word[w]=sChar[j];
w++;
}
str+=new string(word);
last-=(index+1);
index=0;
}//if
}//for
return str;
}//Replace
同样执行100000次,用split是270毫秒,而这个只要160毫秒
且不会出现丢失" "的情况,我觉得由于.Net中对于string类型
的定义的原因,还是把它转化为char类型更好,不知各位有何高
见?
切,如果想不用中间变量实现交换数据,用python一句话解决,用得着这么复杂吗??
a,b=b,a
不信,那看狗狗的解决方法……
大家可以感受下脚本语言的魅力,用python解决如下:(随手用交互解释器写的)
--------我就是传说中的分割线---------
#将字符串转换为list,其中空格被","代替
str = "I am yuchifang".rsplit()
#交换list元素位置
str[0],str[1],str[2] = str[2],str[1],str[0]
#转换list为字符串,","用空格代替
str = " ".join(str)
--------我也是传说中的分割线---------
三句话轻松搞定,你也可以把这个封装到方法里供外界调用,狗狗太懒,不写了(这也是为什么我喜欢脚本语言的最大原因,哈哈)
不知道算不算in place,但却是很简洁的,我想大家用别的语言没有比这更节约纸张的了吧?(除了用中文,呵呵)
#22楼 [
楼主]2005-11-02 19:47 |
你生成了一个字符串数组,应该不算是in place了吧!
其实要做到in place,用python也很容易,我们只需要找出空格所在的位置,将每个单词(substring)作为整体交换位置就行了。由于py的简洁(a,b=b,a),完全可以做到不多消耗一分内存。狗狗懒,不想写了,我认为写程序最重要的是让程序员“in place”,这才是我们pythoner的思想,你说呢?呵呵
推荐大家在工作之余多多关心下生存环境外的东西,为兴趣而工作……
#24楼 [
楼主]2005-11-03 10:25 |
python的(a,b=b,a),它的原理是怎么样的呢?在编译后运行时,它有没有自动的生成一个中间变量来执行这种交换的操作呢?很想了解一下