有关尉迟方兄遇到的面试题。

1、reverse a sentence in place.
例子:I am yuchifang -> yuchifang am I
注意in place
 
嘿嘿!这个题做出来了,迟方兄,我这次是注意了in place了的,在有限的空间里进行转换,所以我只用了一个temp来做临时存放用,而这个存放的也不是整个句子的数组,只是一个单词,这样,先把句子全倒转过来,然后再一个单词一个单词的倒转,那么在转换时就只多用出一个单词的位置来进行处理。
程序函数如下:
   Public Function result(ByVal souce As StringAs String
        souce 
= Trim(souce)
        
Dim i, j As Integer
        
Dim temp As String = Nothing
        j 
= souce.Length
        souce 
= StrReverse(souce)
        
For i = 1 To j
            
If Mid(souce, i, 1<> " " Then temp = Mid(souce, i, 1& temp
            
If Mid(souce, i, 1= " " Or i = j Then
                souce 
= Replace(souce, StrReverse(temp), temp, 11, CompareMethod.Text)
                temp 
= Nothing
            
End If
        
Next
        
Return souce
    
End Function

这次我是仔细测试过了的。
replace的参数里,那两个1,表示从第一个字符起搜索,只替换一个。
StrReverse()这个函数是vb.net里的将字符串的字符倒过来排列的函数
posted @ 2005-04-14 14:52 轻风 阅读(4053) 评论(25)  编辑 收藏 网摘 所属分类: 学习日记

  回复  引用    
#1楼 2005-04-14 16:13 | tongling [未注册用户]
@轻剑傲风
What about in C#?
  回复  引用  查看    
#2楼 [楼主]2005-04-14 16:20 | 轻剑傲风      
reverse(word);
this is in c#
  回复  引用    
#3楼 2005-04-14 16:50 | 西门子乌 [未注册用户]
我觉得这个用string.Split()更简单。
  回复  引用  查看    
#4楼 [楼主]2005-04-14 16:57 | 轻剑傲风      
同迟方兄提出的一样,要注意in place,在有限的空间里完成,如果这不只是一个句子,而是一篇文章,那行你用split()生成的数组的下标会是多少呢?太大了,就不是在有限的空间里完成了,这里强调的是in place,也就是对句子本身做处理。
  回复  引用    
#5楼 2005-04-15 02:26 | figroc [未注册用户]
既然是 in place, 就应该用 StringBuilder.
另外临时存储量为一个单词也太多了.
  回复  引用  查看    
#6楼 2005-04-15 09:31 | Microshaoft      
我相信出题人没有指定实现语言!
C 实现肯定时 栈(数组)
先全部入栈(Reverse)
然后以空格为分割富一组一组的出栈!

public class Class1
{
    
static string s = "WeLcOmE    tO c#.eNjoy FoLkS";
    
static void Main(string[] args)
    
{
        NoStack();
        
string S = "";
        
string stack = "";
        
//我从后向前遍历 相当于全部入栈 
        for (int i = s.Length-1 ; i >= 0 ; i--)
        
{
            
if (s.Substring(i,1!= " ")
            
{
                stack 
= stack + s.Substring(i,1); //push
            }

            
else
            
{
                
if (stack.Length > 0)
                
{
                    
for (int j = stack.Length -1 ; j >=0 ; j-- )
                    
{
                        S 
= S + stack.Substring(j,1);//pop
                    }

                    stack 
= "";
                }

                S 
= S + s.Substring(i,1);
            }

            
if (i == 0)
            
{
                
for (int j = stack.Length -1 ; j >=0 ; j-- )
                
{
                    S 
= S + stack.Substring(j,1);//Pop
                }

            }

        }

        System.Console.WriteLine(
"[" + S + "]");
    }

    
static void NoStack()
    
{
        
string x = "";
        
string S = "";
        
for (int i = 0 ; i < s.Length ; i++)
        
{
            
if (s.Substring(i,1!= " ")
            
{
                x 
= x + s.Substring(i,1);
                
if (i == s.Length - 1)
                
{
                    S 
= x + S;
                }

            }

            
else
            
{
                
if (x.Length > 0)
                
{
                    S 
= x + S;
                    x 
= "";
                }

                S 
= s.Substring(i,1+ S; //空格
            }

        }

        System.Console.WriteLine(
"[" + S + "]");
    }

}


  回复  引用  查看    
#7楼 [楼主]2005-04-15 11:47 | 轻剑傲风      
都是强人呀!
  回复  引用  查看    
#8楼 2005-04-15 16:09 | Microshaoft      
什么叫做 IN-PLACE ??
  回复  引用    
#9楼 2005-04-15 17:37 | junk [未注册用户]
in place就是表明在转换时不能把句子中的任何内容导出到别的内存空间,因此楼上的贴子全是错解。其实这个问题只是另一个问题的变型而已:就是如果有两个变量,如何不借助中间变量而将两个变量的值交换。这是个很经典的C面试题,会做这个则本题轻而易举能解的出来
  回复  引用  查看    
#10楼 2005-04-15 21:14 | Microshaoft      
那也应该用char[] 数组而不能用 string
  回复  引用  查看    
#11楼 2005-04-16 16:10 | 尉迟方      
呵呵,junk所说的in place有点过了,这个本来的意思是,尽量少浪费空间,而速度又不至于太慢。

参考这道题:
http://www.cnblogs.com/realfun/archive/2005/04/13/136499.html#138735
  回复  引用  查看    
#12楼 [楼主]2005-04-18 10:13 | 轻剑傲风      
@junk
如果这只是两个变量不用中间变量的转换,那么第二个变量怎么得到?并没有直接给出,在这里你要得到第二个变量,就不得不使用中间量了!
  回复  引用    
#13楼 2005-04-19 10:12 | 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.没有任何中间用于存储的变量,你说哪种解法有说服力?
其实你还可以用异或的
  回复  引用    
#14楼 2005-04-19 11:22 | junk [未注册用户]
Ninputer给出了异或的解法。用C++/CLI做的(
http://www.cnblogs.com/Ninputer/archive/2005/04/18/139896.html)。其实这种题几年前在C++面试中十分常见的,可能现在用C++的人不多了吧。
sigh
  回复  引用    
#15楼 2005-04-19 11:37 | junk [未注册用户]
其实说白了就是,交换两个变量a、b,如何不借助于中间变量:方法就是:
a=a+b;
b=a-b;
a=a-b;
Ninputer的方法是
a=a^b;
b=b^a;
a=a^b
  回复  引用  查看    
#16楼 2005-04-26 12:09 | 钱塘烟雨      
支持junk
这样才符合"in place"的要求,楼主的做法离要求还是略有偏差
  回复  引用    
#17楼 2005-06-13 22:55 | whxbb [未注册用户]
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”的意思了!可以看一下前面的朋友的讨论!
  回复  引用    
#19楼 2005-08-04 03:30 | bbtds [未注册用户]
各位兄弟,这个函数如果用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类型更好,不知各位有何高
见?
  回复  引用    
#20楼 2005-11-02 16:58 | 笨笨狗 [未注册用户]
切,如果想不用中间变量实现交换数据,用python一句话解决,用得着这么复杂吗??

a,b=b,a
  回复  引用    
#21楼 2005-11-02 17:42 | 笨笨狗 [未注册用户]
不信,那看狗狗的解决方法……

大家可以感受下脚本语言的魅力,用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了吧!
  回复  引用    
#23楼 2005-11-03 09:36 | 笨笨狗 [未注册用户]
其实要做到in place,用python也很容易,我们只需要找出空格所在的位置,将每个单词(substring)作为整体交换位置就行了。由于py的简洁(a,b=b,a),完全可以做到不多消耗一分内存。狗狗懒,不想写了,我认为写程序最重要的是让程序员“in place”,这才是我们pythoner的思想,你说呢?呵呵
推荐大家在工作之余多多关心下生存环境外的东西,为兴趣而工作……
  回复  引用  查看    
#24楼 [楼主]2005-11-03 10:25 | 轻剑傲风      
python的(a,b=b,a),它的原理是怎么样的呢?在编译后运行时,它有没有自动的生成一个中间变量来执行这种交换的操作呢?很想了解一下
  回复  引用    
#25楼 2005-11-03 10:36 | 笨笨狗 [未注册用户]
这个……
我也想知道,找资料去,呵呵




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-04-14 14:54 编辑过
Google站内搜索
[推荐职位]上海盛大网络招聘架构师

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接: