Reverse Words in a String

在leetcode和wikioi都看到这道题。

http://oj.leetcode.com/problems/reverse-words-in-a-string/

相对简单一些,不过听师兄说某些公司面试题要求保留空格数······
用c和js实现了一遍
c语言版:

#include<stdio.h>
#include<stdio.h>
int main(void){
    char str[1000],*stof;
    int i,j,k = 0;
    gets(str);
    i = strlen(str);
    reservestr(str,0,i-1);
    for(j = 0;j<i;){
        while(str[j] != 32 && str[j] != '\0'){
            j++;
        }
        reservestr(str,k,j-1);
        k = j;
        while(str[k] == 32){
            k++;
        }
        j = k;
    }

    puts(str);
    return 0;
}
void reservestr(char *str,int begin,int end){
    char temp;
    while(begin < end){

        temp = *(str + begin);
        *(str + begin) = *(str + end);
        *(str + end) = temp;
        begin++;
        end--;
    }
}

实现原理是先反转字符串,之后指针从字符串头开始向后,按照空格划分单词,因为整句话已经被反转了,所以再把单词反转,正好负负得正,这样的话单词的顺序反过来了,单词也调整回去了,同时这样也可以保留空格数,因为并没有生成新的字符串,而是在原字符串上用指针将单词反转。

javascript版:

        <script type="text/javascript">
		var i=0,k=0,str,len,arr = [],space = "";
		str = prompt("请输入一段字符串 ");
		len = str && str.length || 0;
		while(i++ < len){
			while(str[i] !== " " && i < len){
				i++;
			}
			arr.push(str.slice(k,i));
			k = i;
			while(str[k] === " "){
				space+=" ";
				k++;
				j=1;
			}
			arr.push(space);
			space = '';
			i = k;
		}
		console.log(arr.reverse().join(""));
	</script>

js版的原理是,输入字符串,取字符串长度,之后和C语言的其实很像,但是因为传参数的问题,字符串直接传入是按值传入,所以这里使用了一个辅助的数组来push,通过空格来截取单词,直接push进数组中,空格的话也是push进数组中,因为是正常的字符串顺序取的字符串push,所以在最后通过arr.reverse()来反转数组,然后join(“”)拼接字符串。

str.split(” “).reverse().join(” “)也可以,脚本就是快,哈哈。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据