首页 > 试题广场 >

倒置字符串

[编程题]倒置字符串
  • 热度指数:7235 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I

输入描述:
每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100


输出描述:
依次输出倒置之后的字符串,以空格分割
示例1

输入

I like beijing.

输出

beijing. like I
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
     public static String  reverse(String str)
     {
          String w[] = str.split("\\s");
         StringBuffer sb =new StringBuffer();
        for(int i=w.length-1;i>=0;i--)
        {
         if("".equals(w[i].trim()))
         {
            continue;
         }
        sb.append(w[i]);
        if(i!=0)
        {
        sb.append(" "); 
        }
      }
        return sb.toString();
     }
    public static void main(String args[])
    {
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        System.out.print(reverse(str));
    }
}

发表于 2019-08-24 09:24:14 回复(0)
print(' '.join(input().split(' ')[::-1]))
发表于 2020-04-27 19:21:35 回复(1)
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string str1,str2;
    cin>>str1;
    while(cin>>str2)
    {
        str1.insert(0," ");
        str1.insert(0,str2);
    }
    cout<<str1<<endl;
    return 0;
}

发表于 2019-11-07 13:50:24 回复(6)
#include<stdio.h>
#include<string.h>
void reverse(char* start, char* end)
{
    char tmp;
    while (start < end)
    {
        tmp = *start;
        *start = *end;
        *end = tmp;
        start++;
        end--;
    }
}
int main()
{
    char arr[100] = { 0 };
    gets(arr);
    int len = strlen(arr);
    int i = 0;
    //先将字符串整体翻转
    reverse(arr, arr + len - 1);
    char* a = arr;
    for (i = 0; i <=len; i++)
    {
        if (arr[i] == ' ' || arr[i] == '\0')
        {
            reverse(a, arr + i-1);//空格之前的再一次翻转,两次翻转正好
            a = (arr + i + 1);     
        }

    }
    printf("%s", arr);

    return 0;
}

发表于 2021-12-24 20:38:50 回复(0)
这题使用三步翻转法,即先将字符串整体逆置,再对逆置后的字符串中每一个单词部分进行逆置。
比如:I like beijing.
第一步,字符串整体逆置,得到:.gnijieb ekil I
第二步,将字符串中每一个单词逆置,得到:beijing. like I
这里字符串操作的实现非常关键,故单独实现一个函数进行字符串的逆置,由于每个单词的长度不一,因此通过指针来实现字符串的逆置可以对代码进行简化
代码实现如下:
#include <stdio.h>
#include <string.h>

void ReverseString(char* left, char* right)//反转字符串
{
    while(left <= right)
    {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }
}

int main()
{
    char str[100] = "0";
    gets(str);
    int length = strlen(str);
    //将字符串整体翻转
    ReverseString(str, str + length - 1);
    char* start = str;
    //将字符串中的每个单词翻转
    while(*start)
    {
        char* end = start;
        while(*end != ' ' && *end)//寻找空格或'\0'
        {
            end++;
        }
        ReverseString(start, end - 1);
        if(*end == ' ')
        {
            start = end + 1;
        }
        else
        {
            start = end;
        }
     }
    printf("%s",str);
    return 0;
}


编辑于 2021-05-18 22:44:16 回复(0)
C语言答案,最精简的代码!(作者:dahai.Han):
#include <stdio.h>
#include <string.h>
void invert(char *ch,int start,int end)
{
    char temp;
    while(start<end)
    {
     temp=ch[start];
     ch[start]=ch[end];
     ch[end]=temp;   
     start++;
     end--;
    }
}
void invertsentence(char *arr)
{
 int len=0;
 int start=0;
 int end=0;
 len=strlen(arr);
 invert(arr,start,len-1);
 while(arr[start]!='\0')
 {     
     if(arr[end]!=' ' && arr[end]!='\0')
     {
       end++;
     }  
     else
     {
      invert(arr,start,end-1);
      end++; 
      start=end;
     }     
 }
}
int main()
{
  char a[100];
  gets(a);
  invertsentence(a);
  puts(a);    
  return 0;
}


发表于 2019-08-21 10:51:02 回复(0)
import java.util.*; public class Main{ public static void reverse(char[] array,int start,int end) { while(start < end) { 比特就业课 char tmp = array[start]; array[start] = array[end]; array[end] = tmp; start++; end--; } } public static void main(String[] args) { Scanner scan = new Scanner(System.in); String s = scan.nextLine(); char[] ch = s.toCharArray(); int len = ch.length; //1、整体进行了逆置 reverse(ch,0,len-1); int i = 0;//遍历ch数组 while( i < len ) { int j = i; while(j < len && ch[j] != ' ') { j++; } if(j < len) { reverse(ch,i,j-1); i = j+1; }else{ reverse(ch,i,j-1); i = j; } }
发表于 2023-09-16 19:16:05 回复(0)
int main()
{
	char arr[100] = {0};
    gets(arr);
	int len = strlen(arr);
	char* ptr = &arr[len-1];

	while (ptr>arr)
	{
		if (*ptr==' ')
		{
			printf("%s", ptr+1);
			printf(" ");
			*ptr = '\0';
		}
		ptr--;

	}
	printf("%s\n", ptr);
	return 0;
}

发表于 2023-06-11 17:29:38 回复(0)
//I like beijing.
//整体翻转:
//.gnijieb ekil I
//单词翻转:
//beijing. like I
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main() {
    string s;
    getline(cin, s);
    reverse(s.begin(), s.end());//整体翻转
    auto first = s.begin();
    while (first != s.end())
    {
        auto last = first;
        while (last != s.end() && *last != ' ')
        {
            last++;
        }
        reverse(first, last);//单词翻转
        if (last != s.end())
        {
            first = last + 1;
        }
        else
        {
            first = last;
        }
    }
    cout << s <<endl;
    return 0;
}

发表于 2023-03-25 20:12:13 回复(0)
1、整体数据进行逆置
2、每个单词进行逆置
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
    string str;
    getline(cin,str);
    //进行整体的逆置
    reverse(str.begin(), str.end()); 
    auto start=str.begin();
    while(start!=str.end())
    {
         auto end=start;
         while(end != str.end() && *end != ' ')
             end++;
        //每个单词逆置
         reverse(start,end); 
        // start进行迭代
        if(end!=str.end())
            start=end+1;
        else
            start=str.end();
    }
    
    cout << str;

}


发表于 2022-10-14 14:56:49 回复(0)
void reserver(char* left,char* right)
{
  while(left<right)
  {
    char tmp=*right;
    *right=*left;
    *left=tmp;
    right--;
    left++;
  }  
}
int main()
{
    char arr[100]={0};
    gets(arr);
    int len=strlen(arr);
    reserver(arr,arr+len-1);
    char*s=arr;
    char*e=s;
    while(*s!='\0')
    {   
        if(*s==' ')
        {
         reserver(e,s-1);
          e=s+1;
        }
        s++;
    }
    reserver(e,s-1);
    printf("%s",arr);

    return 0;
}
发表于 2022-07-10 20:06:31 回复(0)
#include<stdio.h>
#include<string.h>
void reverse(char* l, char* r)
{
	while (l < r)
	{
		char tmp = *l;
		*l = *r;
		*r = tmp;
		l++;
		r--;
	}
}
int main()
{
	char arr[100] = { 0 };
	gets(arr);
	int len = strlen(arr);
	char* left = arr;
	char* right = arr + len - 1;
	reverse(left,right);
	char* cur = arr;
	char* start = arr;
	while (*cur != '\0')
	{
		while ((*cur != ' ')&&(*cur!='\0'))
		{
			cur++;
		}
		reverse(start, cur - 1);
		start = cur + 1;
		cur++;
	}
	printf("%s", arr);
	return 0;
}


发表于 2022-03-20 17:18:20 回复(0)
public static void main(String[] args){
        //每次读入一个字符串,以" "分隔,
        Scanner scanner=new Scanner(System.in);
        while(scanner.hasNext()){
            String str= scanner.nextLine();
            String[] arr=str.split(" ");
            //利用栈先进后出的特性
            Stack<String> tmp=new Stack<>();
            //将字符串数组加入到栈
            for (int i = 0; i < arr.length; i++) {
                tmp.push(arr[i]);
            }
            while (!tmp.isEmpty()){
                for (int i = 0 ; i < tmp.size(); i++) {
                    //StringBuilder进行字符串拼接
                    StringBuilder stri=new StringBuilder();
                    stri.append(tmp.pop() + " ");
                    System.out.print(stri);
                }
            }
        }
    }

发表于 2022-01-19 00:10:23 回复(0)
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s;
    while(getline(cin,s))
    {
        string str;
       int fast,slow;
        int sign=1;
      fast=slow=s.size()-1;
        while(fast!=0)
        {
            if(s[fast]==' ')
            {
                int tmp=fast;
               while(slow-tmp){
                    str+=s[tmp+1];
                   tmp++;
               }
             if(s[slow]!=' ')
                str+=s[fast];
                slow=fast;
              
            }
              fast--;
        }
         while(slow-fast)
         {
             str+=s[fast];
             fast++;
         }
        cout<<str<<endl;
    }
    
    return 0;
}


编辑于 2022-01-18 13:46:58 回复(0)
//C语言答案
#include <stdio.h>
#include <string.h>

void sort(char *star,char *end)
{	
	while (star < end)
	{
		char p = *star;
		*star = *end;
		*end = p;
		star++;
		end--;
	}
	
}
int main()
{
	char a[100];
	char b[100];
	int i;
	gets(a);
	int len = strlen(a);
	char *star = a;
	sort(a, a + len - 1);  //俩次倒置即可
	for (i = 0; i <= len; i++)
	{

		if (*(a + i) == ' '|| *(a + i)=='\0')
		{
			sort(star,a+i-1);
			star = (a + i+1);
		}
	}
	printf("%s", a);
	return 0;
	
}

发表于 2021-12-12 15:15:39 回复(0)
#include <stdio.h>
#include <string.h>
int main()
{

    char s[300]={0};
    fgets(s,300,stdin);
    unsigned int len=strlen(s);
    int flag=len-1;//记录第一个flag是换行
    int i=0;
    int j=0;
    for(i=len-2;i>=0;i--)//从换行前一个字符开始找空格
    {
        if(s[i-1]==' '||i==0)//i==0要特殊处理,因为s[-1]就越界了
        {
            for(j=i;j<flag;j++)
            {
                printf("%c",s[j]);
            }
            flag=i-1;//记录空格位置
            printf(" ");
        }
    }
    printf("\n");
    return 0;
}

发表于 2021-11-28 19:32:33 回复(0)
#include<stdio.h>
#include<stdlib.h>
void change(char* left, char* right) 
{
    char temp = 0;
    while (left < right)
    {
        temp = *left;
        *left = *right;
        *right = temp;
        left++;
        right--;
    }
}
int main(void)
{
    char sz[100] = { 0 },*p=sz;
    gets(sz);
    int len = strlen(sz);
    change(sz, sz + len - 1);
    for (int i = 0; i <= len; i++)
    {
        if (sz[i] ==' '|| sz[i] == '\0')
        {
            change(p, sz + i - 1);
            p = sz + i + 1;
        }
    }
    printf("%s\n", sz);
    return 0;
}

发表于 2021-08-26 17:57:56 回复(0)
import java.util.Scanner;

public class Main {

    public static void reverse(char[] c,int i,int j) {
        while(i < j) {
            char tmp = c[i];
            c[i] = c[j];
            c[j] = tmp;
            i++;
            j--;
        }
    }

    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        String s = cin.nextLine();
        s = s.trim();
        char[] c = s.toCharArray();
        reverse(c,0,c.length-1);
        int start = 0;
        for(int i = 0; i < c.length; i++) {
            if(c[i] == ' ') {
                reverse(c,start,i-1);
                start = i+1;
            }
        }
        reverse(c,start,c.length-1);
        System.out.println(new String(c));
    }

}

发表于 2021-04-13 13:17:11 回复(0)
#include<stdio.h>
#include<string.h>
int main()
{
    char arr[100];
    int k = 0;
    int j = 0;
    gets(arr);
    int i = strlen(arr);
    int m = i - 1;
    for (k = i-1; k>=0; k--)
    {
        if (arr[k] == ' ')
        {
            for (j = k + 1; j <= m; j++)

            {
                printf("%c", arr[j]);
                if (j == (i - 1))
                {
                    printf(" ");
                }
            }
            m = k ;
        }
        if (k == 0)
        {
            for (j = 0; j < m; j++)
            {
                printf("%c", arr[j]);
            }
            
        }
    }
    return 0;
}


发表于 2021-03-08 15:41:10 回复(0)
#include <stdio.h>
#include <string.h>

int main() {
    
    char str[101];
    scanf("%[^\n]", str);
    
    for (char* i = str + strlen(str) - 1; i >= str; --i) {
        if (*i == ' ') {
            printf("%s ", i + 1);
            *i = 0;
        }
    }
    printf("%s\n", str);
    
    return 0;
}

发表于 2020-11-06 20:41:23 回复(0)