zoukankan      html  css  js  c++  java
  • 翻转句子中单词的顺序 面试题

    /*
    题目描述:翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。
    为简单起见,标点符号和普通字母一样处理。如:"I am a student."翻转成"student. a am I"。
    
    常见面试题
    */
    
    #include<iostream>
    #include<vector>
    #include<assert.h>
    #include<cstring>
    using namespace std;
    
    void swap(char &a, char &b)
    {
    	char tmp = b;
    	b = a;
    	a = tmp;
    }
    
    void swap_str(char* str, int start, int end)
    {
    	assert(str!=NULL && start <= end);
    	int low = start;
    	int high = end;
    
    	//整个句子按字符翻转
    	while (low < high)
    	{
    		swap(str[low], str[high]);
    		low++;
    		high--;
    	}
    
    }
    
    //方法一:依次读入句子中的每个单词,并将它们放入一个栈中。然后再将单词出栈。
    //时间复杂度:O(n),空间复杂度:O(n);
    
    //方法二:首先将整个句子按字符翻转,然后再将其中每个单词的字符旋转。
    //时间复杂度:O(n),空间复杂度:O(1);
    void reverse_word(char str[])
    {
    	int len = strlen(str);
    
    	//翻转整个句子
    	swap_str(str, 0, len-1);
    
    	int s = 0;
    	int e = 0;
    	//翻转每个单词
    	for (int i=0; i<len; i++)
    	{
    		e = i;
    		if (str[e] == ' ')
    		{
    			//str[e]为空格,所以范围是[s,e-1].
    			swap_str(str, s, e-1);
    			s = e + 1;
    		}
    	}
    }
    
    int main()
    {
    	char str[] = "I am a student.";
    	reverse_word(str);
    	cout<<str<<endl;
    	return 0;
    }
    

      

    多学习,多总结。
  • 相关阅读:
    英语俚语里的gotta和gonna
    如何设置Win XP远程登录如何远程控制电脑
    C#中as与is的用法(收藏)
    just用法
    even用法
    up to用法小结
    go out with用法
    realize与recognize辨析
    go through用法
    堆优先队列
  • 原文地址:https://www.cnblogs.com/yanhaiming/p/2595817.html
Copyright © 2011-2022 走看看