也谈 尉迟方 遇到的面试题! 参阅"装配脑袋" 实现"就地正法 in place"! 考察的是"栈"的思想!

原贴:
in place:

public class Class1
{
    
static string s = "  boy     love  girls     "

    
static void Main(string[] args)
    
{
        System.Console.WriteLine(
"[" + s + "]");
        
char[] chars = s.ToCharArray();
        
for (int i = 0 ; i < chars.Length / 2 ; i ++)
        
{
            Swap(
ref chars[i],ref chars[chars.Length - i - 1]);
        }


        
int j = 0;
        
for (int i = 0; i <= chars.Length; i++)
        
{
            
if (i == chars.Length || chars[i] == ' ')
            
{
                
//这里参阅了 "装配脑袋" 自己没想出来
                for (int k = j; k < (j + i - 1/ 2f; k ++)
                
{
                    Swap(
ref chars[k], ref chars[i - 1 - k + j]);
                }

                j 
= i + 1;
            }

        }


        
string S = new string(chars);
        System.Console.WriteLine(
"[" + S + "]"); 
        System.Console.ReadLine();
    }


    
static void Swap(ref char x,ref char y)
    
{
        x 
= (char) ((int) x + (int) y);
        y 
= (char) ((int) x - (int) y);
        x 
= (char) ((int) x - (int) y);
    }

}




有关尉迟方兄遇到的面试题。
http://www.cnblogs.com/aowind/archive/2005/04/14/137522.html


其实这道题考查的应该是数据结构中栈的思想,用两个栈实现起来非常简单!
我想出题人根本不是在考察你类库的函数熟不熟!
C 语言仅需 字符数组 + Stack 思想 即可实现
先把原字符串从右到左全部入"大栈": STACK 然后从栈顶一个个出栈 弹出的元素 再压入另一个"小栈": stack
当"大栈STACK" 弹出的元素为空格 先暂停 再将 "小栈stack" 里的所有元素弹出 (怡子章 => 章子怡)... 循环 ...

 

public class Class1
{
    
static string s = "   我   爱    张柏芝  和  章子怡     ";

    
static void Main(string[] args)
    
{
        System.Console.WriteLine(
"[" + s + "]");
        
//Stack 思想
        string S = ""//相当于一个栈 STACK
        string stack = ""//相当于一个栈 stack
        
//我从后向前遍历 相当于全部入栈,为然后出栈做准备
        
// 倒着访问就相当于全部入栈后, 后进先出 really?
        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 + "]");
        
//非 Stack 思想
        NoStack();
    }

    
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 + "]");
    }

}



 

posted @ 2005-04-15 13:46  于斯人也  阅读(1307)  评论(5编辑  收藏  举报