首页 > 试题广场 >

翻转字符串(1)

[编程题]翻转字符串(1)
  • 热度指数:3107 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定字符类型的数组chas,请在单词间做逆序调整。只要做到单词的顺序逆序即可,对空格的位置没有要求。

输入描述:
输入一行只含字母和空格的字符串,代表chas


输出描述:
输出一行字符串,代表逆转顺序后的字符串。
示例1

输入

i am a student

输出

i ma a tneduts

备注:
时间复杂度,空间复杂度
s = input().split()
for i in s:
    print(i[::-1], end = ' ')
发表于 2019-10-13 06:31:35 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main(){
    string s;
    getline(cin, s);
    int i=0, l=0, r, n=s.length();
    while(i<n){
        if(s[i]==' '){
            for(r=i-1;l<r;l++,r--)
                swap(s[l], s[r]);
            l = i+1;
        }
        i++;
    }
    for(r=i-1;l<r;l++,r--)
        swap(s[l], s[r]);
    cout<<s<<endl;
    return 0;
}

发表于 2020-05-01 02:23:34 回复(0)
这题空间复杂度O(1)还是要费点脑子的,先献上python的一行流氓解法
print(' '.join([word[::-1] for word in input().split()]))
然后正儿八经的按照题意利用双指针来求解,定义一个左指针始终指向单词的起始位置,遍历字符串中的字符,如果遇到空格,表示此时已经遍历完了一个单词,定义一个右指针指向空格前的一个字符,为单词尾,然后反转左右指针所指的这段子字符串。完成翻转后再将左指针指到空格右边,为下一个单词的起始位置,如法炮制寻找右指针。注意最后一个单词没有空格来识别,需要特殊处理一下。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        char[] str = br.readLine().toCharArray();
        int ptr = 0, left = 0, right = 0;
        while(ptr < str.length){
            if(str[ptr] == ' '){
                right = ptr - 1;
                reverse(str, left, right);
                left = ptr + 1;
            }
            ptr ++;
        }
        // 最后一个单词要特殊操作
        right = ptr - 1;
        reverse(str, left, right);
        System.out.println(str);
    }
    
    private static void reverse(char[] str, int left, int right) {
        while(left < right){
            char temp = str[left];
            str[left] = str[right];
            str[right] = temp;
            left ++;
            right --;
        }
    }
}

发表于 2021-05-28 10:32:33 回复(0)
#include <iostream>
#include <string>
using namespace std;
int main(){
    string str;
    while(cin >> str){
        int l = str.size();
        int start=0, end=0;  //利用双指针,当遇到空格时,输出str[end->start];
        for(int i=0; i<l; i++){
            end = i;
            if(str[i] == ' ' || i == l-1){  //遇到空格 或者 到最后一个字符
                for(int j=end; j>=start; j--){
                    cout << str[j];
                }
                cout << ' ';
                start = i+1;
                end = i+1;  //打印完后,start和end 指向空格下一字符;
            }
        }
    }
    return 0;
}

发表于 2020-01-17 11:30:16 回复(0)
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
	    char[] arrs = scanner.nextLine().toCharArray();
        
        int length = arrs.length;
        int start = 0;
        while(start<length){
            int end = start;
            while(end<length && arrs[end] != ' '){end++;}
            for(int j=start;j<(start + end)/2;j++){
                char temp = arrs[j];
                arrs[j] = arrs[end+start-1-j];
                arrs[end+start-1-j] = temp;
            }
            start = end+1;
        }
        
        for(int i=0;i<length;i++){
            System.out.print(arrs[i]);
        }
	}
}

发表于 2019-10-17 16:40:25 回复(0)
#include <stdio.h>
#include <string.h>

#define MAXLEN 100005

void reverse(char *str, int start, int end);

int main(void) {
    char str[MAXLEN];
    int len;
    fgets(str, MAXLEN, stdin);
    len = strlen(str);
    str[--len] = '\0';
    for (int i = 0; i < len; i++) {
        int j;
        for (j = i; j < len && str[j] != ' '; j++)
            ;
        reverse(str, i, j - 1);
        i = j;
    }
    puts(str);
    return 0;
}

void reverse(char *str, int start, int end) {
    char t;
    while (start < end) {
        t = str[start];
        str[start] = str[end];
        str[end] = t;
        start++;
        end--;
    }
}

发表于 2022-02-06 19:30:37 回复(0)
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e5+10;
int main() {
    char cc[MAX];
    fgets(cc, MAX, stdin);
    string str = cc;
    str.pop_back();
    string tmp;
    for (int i = 0; i < str.size(); i++) {
        if (str[i] == ' ') {
            reverse(tmp.begin(), tmp.end());
            printf("%s ", tmp.c_str());
            tmp = "";
        }else{
            tmp = tmp + str[i];
        }
    }
    reverse(tmp.begin(), tmp.end());
    printf("%s", tmp.c_str());

}
发表于 2023-03-22 23:23:57 回复(0)
#include<bits/stdc++.h>
using namespace std;

int main(){
    string s1;
    getline(cin,s1);
    int x=0,y=-1;
    string s2;
    bool flag=false;
    int n=s1.size();
    for(int i=0;i<n;i++){
        if(s1[i] == ' '){
            x=y+1;
            y=i;
            s2=s1.substr(x,y-x);
            reverse(s2.begin(),s2.end());
            cout<<s2<<" ";
            flag= true;
        }
    }
    if(!flag){
        reverse(s1.begin(),s1.end());
        cout<<s1;
    }else{
        while(s1[n-1]!=' '&&n>0){
        cout<<s1[n-1];
            n--;
    }
    }
    return 0;
}


发表于 2022-04-02 16:30:01 回复(0)
string=input()
print(' '.join([i[::-1] for i in string.split(' ')]))

发表于 2021-09-07 09:14:28 回复(0)
#include<iostream>
#include<string>

using namespace std;
//翻转单词
void reverse(string str, int count){
    for(int i=0, j=count-1;i<j;i++,j--){
        char tmp=str[i];
        str[i]=str[j];
        str[j]=tmp;
    }
    cout<<str<<' ';
}


int main(){
    string tmp, str;
    getline(cin, str);
    //增加尾部空格
    if(str[str.size()]!=' '){
        str+=' ';
    }
    //统计单个单词大小
    int count;
    for(int i=0;i<str.size();i++){
        if(str[i]!=' '){
            tmp+=str[i];
            count++;
        }
        else{
            reverse(tmp, count);
            tmp="";
            count=0;
        }
    }
    return 0;
}

发表于 2020-12-24 10:32:23 回复(0)
import java.util.Scanner;
public class Main {
    static String reverse(String str,int begin,int end){
        char[] arr = str.toCharArray();
        for(;begin<end;begin++,end--){
            char tmp = arr[begin];
            arr[begin] = arr[end];
            arr[end] = tmp;
        }
        return  new String(arr);
    }

    static Scanner scan = new Scanner(System.in);

    public static void main(String[] args) {
        while(scan.hasNext()){
            String input = scan.next();
            String ret = reverse(input, 0, input.length() - 1);
            System.out.print(ret);
            System.out.print(" ");
        }
    }
}
编辑于 2020-10-26 22:40:44 回复(0)
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
	string s;
	while (getline(cin,s))
	{
		string temp;
		int len = s.size();
		int i = 0;
		for(int i=0;i<=len+1;++i)
		{
			while (s[i] != ' ')//while语句作用是构造每一个单词字符串临时变量
			{
				temp += s[i];
				i += 1;
				if (i == len )
				{
					break;
				}
			}
			reverse(temp.begin(), temp.end());//将一个单词字符串反转
			cout << temp;//立即打印输出
			if (i == len)
				break;
			if (s[i] == ' ')
			{
				cout << ' ';
			}
			temp.clear();//记得清空,再次开始处理第二个单词
		}	
		}
	}



编辑于 2020-07-22 11:40:41 回复(0)
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
using namespace std;
int main()
{
    string str;
    while (getline(cin, str))
    {
        stringstream ss;
        ss << str;
        while (ss >> str)
        {
            reverse((str).begin(), (str).end());
            cout << str << " ";
        }
        cout << endl;
    }
    return 0;
}
发表于 2020-07-21 14:42:41 回复(0)
import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        String[] strings = s.split(" ");
        for (int i = 0; i < strings.length; i++) {
            if (strings[i].length() > 1){
                StringBuilder sb = new StringBuilder(strings[i]);
                sb.reverse();
                strings[i] = String.valueOf(sb);
            }
            System.out.print(strings[i]+" ");
        }
    }
}

发表于 2020-06-02 12:54:12 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    getline(cin,s);
    s=s+' ';
    string tmp="";
    for(int i=0;i<s.length();i++)
    {	
    	if(s[i]==' ')
    	{	
			reverse(tmp.begin(),tmp.end());
			cout<<tmp<<" ";
			tmp="";    		
		}else
		{
			tmp=tmp+s[i];
		}
	}
	return 0;
}
拙见
发表于 2020-05-19 15:59:10 回复(0)
#include <iostream> (720)#include <string>
using namespace std;
int main() {  string s, t;  getline(cin, s);  int start = 0;  int end = 0;  //cout << s.size();  for (int i = 0; i <= s.size(); i++){      if ((s[i] == ' ') || (i == s.size())){    end = i - 1;
   for (int j = end; j >= start; j--){     t += s[j];         }    t += " ";        start = end + 2;       }   else{    continue;   }     }  cout << t << endl;    return 0; }

发表于 2020-05-09 20:15:18 回复(0)
最后一个单词末尾必须加空格才能通过,这OJ评判的有问题。
import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNext()){
            String input = scanner.nextLine();
            String[] array = input.split(" ");
            String result = "";
            for(int i=0;i<array.length;i++){
                result += new StringBuffer(array[i]).reverse();
                //if(i!=array.length-1){
                    result += " ";
                //}
            }
            System.out.println(result);
        }
    }

}


发表于 2020-05-06 17:39:16 回复(0)
#include<cstdio>
(802)#include<cstring>
#include<algorithm>
using namespace std;
void reverse(char str[],int l,int r){
    int k=0;
    for(int i=l;i<=(l+r)/2;++i){
        swap(str[i],str[r-k]);
        ++k;
    }
}
int main(){
    char str[100010];
    while(gets(str)!=NULL){
        int len=strlen(str);
        for(int i=0;i<len;++i){
            if(str[i]!=' '){
                int j=i;
                while(str[i+1]!=' '&&str[i+1]!='\0'){
                    ++i;
                }
                reverse(str,j,i);
            }
        }
        puts(str);
    }
}

发表于 2020-03-25 17:50:24 回复(0)
class Solution:
    def reverseStr(self, chas: str) -> str:
        res = ''
        chas_list = chas.split()
        for val in chas_list:
            res += val[::-1]
            res += ' '
        return res


if __name__ == '__main__':
    chas = input()
    sol = Solution()
    ret = sol.reverseStr(chas)
    print(ret)

发表于 2020-02-13 21:20:53 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		String s = reader.readLine();
		char[] chas = s.toCharArray();

		System.out.println(retota(chas));
	}

	public static String retota(char[] chas) {
		if (chas == null || chas.length == 0) {
			return "";
		}
		int before = 0;
		for (int i = 0; i < chas.length; i++) {
			if (chas[i] == ' ') {
				reserve(chas, before, i - 1);
				before = i + 1;
			} else if (i == chas.length - 1) {
				reserve(chas, before, i);
			}
		}
		return new String(chas);
	}

	public static void reserve(char[] chas, int start, int end) {
		while (start < end) {
			char temp = chas[start];
			chas[start] = chas[end];
			chas[end] = temp;
			start++;
			end--;
		}
	}
}

发表于 2020-02-13 20:52:35 回复(0)