首页 > 试题广场 >

倒置字符串

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

输入描述:
输入一个仅包含小写字母、空格、'.' 的字符串,长度不超过100。
'.' 只出现在最后一个单词的末尾。


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

输入

I like beijing.

输出

beijing. like I
#include<stdio.h>

void reserve()
{
    char arr[100];
    if ((scanf("%s",arr))!=EOF)
    {
        reserve();
        printf("%s ",arr);
    }

}
int main()
{
    reserve();
    return 0;
}
使用递归函数 从后往前打印

发表于 2022-10-04 15:56:38 回复(2)
#include <stdio.h>
#include<assert.h>

void reverse(char*left,char*right)
{
    assert(left);
    assert(right);

    while(left<right)
    {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }
}
int main() {
    char arr[101] = {0};
    gets(arr);
    int len = strlen(arr);
    reverse(arr,arr+len-1);
    char*start=arr;
    while(*start)
    {
        char*end=start;
        while(*end != ' ' && *end != '\0')
        {
            end++;
        }
        reverse(start,end-1);
        if(*end != '\0')
        end++;
        start = end;
    }
    printf("%s\n",arr);


    return 0;
}

用C语言解出,思路是先整体反转,在进行每个单词的反转,用句号和空格判断单词。
发表于 2023-09-22 22:47:22 回复(1)
#include <stdio.h>

int main() {
    char input[100];
    gets(input);
    int index = 0;
    char str[100][100] = {0};
    int x = 0,y = 0;
    while(input[index] != '\0'){
        if(input[index] == ' '){
            y = 0;
            x++;
        }else {
            str[x][y] = input[index];
            y++;
        }
        index++;
    }
    index = 0;
    for(int i = x; i >= 0; i--){
        index = 0;
        while(str[i][index] != '\0'){
            printf("%c",str[i][index]);
            index++;
        }
        printf(" ");
    }
}

思路:
先遍历获取到的每个字符,如果这个字符不是空格就放到一个二维数组x,y里,然后y++。如果是空格那么x++,y重置。这样就达到了二维数组每行都是一个单词包括符号。
然后再遍历打印,x从最高开始递减1。
发表于 2024-02-22 16:35:30 回复(0)
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <string.h>
using namespace std;

// 实现特殊字符串反转
// 示例:
// 将 I like China. 转换为 China. like I
// 字符串长度最长为100

// 将字符串分解并将子字符串存入多个指针数组
char** split_str(const char* string, size_t str_size, const int* kongge_points, int points_size, int* words_size)
{
    char** part_string = new char* [points_size + 1];
    for (int n = 0; n < points_size + 1; n++)
    {
        part_string[n] = new char[words_size[n]+1];
    }
    // 第一个单词
    int first_word_index = 0;
    for (first_word_index = 0; first_word_index < words_size[0]; ++first_word_index)
    {
        //part_string[][]中第一个[]代表取第几个动态字符数组,第二个[]代表字符数组的第几个字符
        part_string[0][first_word_index] = string[first_word_index];
    }
    part_string[0][first_word_index] = '\0';
    // 中间所有单词
    int i = 1;
    for (i = 1; i < points_size; ++i)
    {
        int j = 0, k = 0;
        for (j = kongge_points[i - 1] + 1; j < kongge_points[i]; ++j, k++)
        {
            part_string[i][k] = string[j];
        }
        part_string[i][k] = '\0';
    }

    // 结尾含'.'的单词
    int last_word_index = 0, k = 0;
    for (last_word_index = kongge_points[points_size - 1] + 1; last_word_index < (int)str_size; ++last_word_index, ++k)
    {
        part_string[points_size][k] = string[last_word_index];
    }
    part_string[points_size][k] = '\0';

    return part_string;
}

void printReversedStr()
{
    // 初始接收输入工作
    char ch[101] = "\0";
    char c;
    int i = 0;
    int kongge_index[20] = { 0 };    // 空格在ch[]中的下标  (假定最多有20个空格)
    int kongge_num = 0;      // 总空格数   // 总空格数+1代表单词数
    while (scanf("%c", &c) != EOF && c != '\n')
    {
        ch[i] = c;
        if (c == ' ') { kongge_index[kongge_num++] = i; }
        i++;
    }
    ch[i] = '\0';
    if (kongge_num == 0) { printf("输入字符串没有空格!\n"); return; }
    const size_t str_long = strlen(ch);

    // 统计每个单词(子字符串)长度
    int* words_size = new int[kongge_num + 1];   // 每个单词的长度
    int word_count = 0;
    words_size[word_count] = kongge_index[word_count];
    for (word_count = 1; word_count < kongge_num; ++word_count)
    {
        words_size[word_count] = *(kongge_index + word_count) - *(kongge_index + word_count - 1) - 1;
    }
    words_size[word_count] = (int)str_long - *(kongge_index + word_count - 1) - 1;

    // 调用分割函数
    char** partStr = split_str(ch, str_long, kongge_index, kongge_num, words_size);

    // 逆置操作
    char** result = new char* [kongge_num + 1];
    for (i = 0; i < kongge_num + 1; i++)
    {
        result[i] = partStr[kongge_num - i];
    }

    // 打印输出
    for (int k = 0; k < kongge_num + 1; k++)
    {
        printf("%s ", result[k]);
    }
    printf("\n");

    // 释放堆区内存
    for(int d = 0;d < kongge_num+1;d++)
    {
        free(result[d]);      // result[d]和partStr[d]指向同一片内存  仅需要释放一次
    }
    delete[] words_size;
    delete[] result;
    delete[] partStr;
}

int main()
{
    printReversedStr();
    return 0;
}
发表于 2023-09-19 18:49:12 回复(0)
//写了一个小时,服了
void reverse_string(char* arr,char* end)
{
    char* start = arr;
    while (start < end)
    {
        char tmp = *start;
        *start = *end;
        *end = tmp;
        end--;
        start++;
    }
}

int main()
{
    char arr[100] = "";
    gets(arr);
    char* end = arr;
    while (*end++ != '\0')
    {
        ;
    }
    end -= 2;
    reverse_string(arr,end);
    char* point = arr;
    while (*point != '\0')
    {
        char* begin = point;
        char* stop = point;
        while (*stop != ' ' && *stop != '\0')
        {
            stop++;
        }
        stop--;
        reverse_string(begin, stop);
        point = stop + 2;
    }
    printf("%s", arr);
}
发表于 2023-05-24 10:56:24 回复(0)
#include <stdio.h>
void converse(char*left,char*right)
{
    while(left<right)
    {
    char temp=*left;
    *left=*right;
    *right=temp;
    left++;
    right--;
    }
}
int main()
{
    char arr[101]={0};
    gets(arr);
    int len=strlen(arr);
    converse(arr,arr+len-1);
    char*start=arr;
      char*end=start;
    while(*start)
    {
     
    while(*end!=' '&&*end!='\0')
    {
        end++;
    }
    converse(start,end-1);
   
        end++;
    start=end;
    }
    printf("%s",arr);
    return 0;
}
发表于 2024-02-06 12:37:05 回复(0)
#include <stdio.h>
#include <assert.h>
#include <string.h>

void Reverse_arr(char* left, char* right) {
    assert(left);
    assert(right);

    char tem = 0;

    while (left < right) {
        tem = *left;
        *left = *right;
        *right = tem;

        left++;
        right--;
    }
}

int main() {
    char arr[101] = { 0 };
    int len = 0;
    char* left = NULL;
    char* right = NULL;

    //读取
    gets(arr);

    len = strlen(arr);
    right = &arr[len - 1];
    left = &arr[0];

    //逆序整个句子
    Reverse_arr(left, right);

    //逆序每一个单词
    while (*right != '\0') {
        right = left;

        //right在正常情况下,遇到空格就可以判断单词结束,进行逆序单词操作了
        //但还有一种特殊情况:单词在句子的末尾。
        //此时right指向的不是空格,而是'\0'
        //所以要把这2种情况都加上
        while (*right != ' ' && *right != '\0') {
            right++;
        }
        //此时right指向空格,所以要自减1再传入逆序函数
        Reverse_arr(left, right - 1);
        left = right + 1;
    }
    //输出
    printf("%s\n", arr);

    return 0;
}

编辑于 2024-01-24 15:37:56 回复(1)
#include<stdio.h>
#include<string.h>
void reverse(char* left,char* right)
{
    while (left < right)
    {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }
}
int main()
{
    char str[101] = { 0 };
    gets(str);
    int i = 0;
    int len = strlen(str)-1;
    reverse(str, str + len);
    int k = 0;
    for (i = 0; i <= len+1; i++)
    {
        if (str[i] == ' ' || i == len+1)
        {
            reverse(str+k,str+i-1);
            k = i+1;
        }
    }
    puts(str);
    return 0;
}
发表于 2024-01-21 11:15:04 回复(0)
#include<stdio.h>
int main()
{
    char n[101] = { 0 };
    int i = 0;
    int j = 0;
    gets(n);
    for (i = 101; i >= 0; i--)
    {
        if (n[i] == ' ')
        {
            j = i;
            j++;
            while (n[j] != '\0' && n[j] != ' ')
            {
                printf("%c", n[j]);
                j++;
            }
            printf("%c", ' ');
        }
        if (i == 0)
        {
            j = i;
            while (n[j] != '\0' && n[j] != ' ')
            {
                printf("%c", n[j]);
                j++;
            }
        }
    }
    return 0;
}
编辑于 2024-01-01 18:18:57 回复(0)
#include <stdio.h>

void change(char*p,int r)
{
   
    char y = 0;
    for (int i = 0; i < r-1 ; ++i, --r)
    {
        y = *(p+i);
        *(p + i) = *(p + r-1 );
        *(p + r-1 ) = y;

    }


}
void change2(char* q)
{
    int i = 0;
    for (; (*(q + i) != ' ') && (*(q + i) != '\0'); i++);
        if (*(q + i) != '\0')
        {
            change2(q + i + 1);
            change(q, i);
        }
        else
        {
            change(q,i);
        }
}

int main()
{
    char arr[100] = {0};
    gets(arr);
    int c = strlen(arr);
    change(arr ,c);
    change2(arr);
    printf("%s", arr);


    return 0;
}
编辑于 2023-12-24 19:34:57 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String[] str = in.nextLine().split(" ");

        for(int i = str.length - 1; i >= 0; i--) {
            System.out.print(str[i] + " ");
        }
    }
}
发表于 2023-12-01 16:52:23 回复(0)
#include <stdio.h>
//递归,用一个字符数组拾取每个单词分别打印24
void print(char* p)
{
    int i=0;
    char copy[101];
    while(1)
    {
       copy[i]=*p;
       p++;
       i++;
       if(*p=='.')
       {
        printf("%s. ",copy);
        break;
       }
      else  if(*p==' ')
       {
        print(p+1);
        printf("%s ",copy);
        break;
       }  
    }
}

int main()
{  
    char arr[101];
    gets(arr);
    print(arr);
    return 0;
}
发表于 2023-11-29 21:39:51 回复(0)
#include <stdio.h>
#include<string.h>
void revers(char* left, char *right)
{
    while (left < right)
    {
        char a = *left;
        *left = *right;
        *right = a;
        left++;
        right--;
    }
}
int main()
{
    char arr[101];
    gets(arr);
    int a = strlen(arr);
    revers(arr, arr + a - 1);
    char* start = arr;
    char* end = arr;
    while(*start)
    {
        while (*end != ' ' && *end != '\0')
        {
            end++;
        }
        revers(start, end - 1);
        if (*end)
        {
            end++;
        }
        start = end;
    }
    printf("%s\n", arr);
    return 0;
}

发表于 2023-11-24 16:56:51 回复(1)
#include <stdio.h>
#include <string.h>
void reverse(char* left, char* right) {
    //先将字符串整体翻转
    while (left < right) {
        //交换左右指针的值
        char temp = *left;
        *left = *right;
        *right = temp;
        //移动左右指针
        left++;
        right--;
    }

}


int main() {
    char arr[101] = {0};
    // scanf("%s", arr);  scanf遇到空格就不接收后面的字符
    gets(arr);
    int length = strlen(arr);
    //翻转整个字符串
    reverse(arr, arr + length - 1);
    char* start = arr;
    char* end = start;
    while (*start) {
        //移动end指针
        while (*end != ' ' && *end != '\0') {
            end++;
        }
        //退出循环时,end指针指向空格或者来到字符串的结束位置
        //得到每个单词  翻转
        reverse(start, end - 1);
        //end指针+1  跳过空格(或者'\0')  如果有多个空格,下次循环也会跳过
        end++;
        //当end指向'\0'时,end++ 跳过'\0'后,之后的字符也是0,依旧会跳出循环
        start = end;
    }
    //指针直接操作的是数组本身,直接打印就行
    printf("%s",arr);
    return 0;
}
发表于 2023-10-21 19:22:59 回复(0)
#include <stdio.h>
#include <string.h>

void reverse(char* left, char* right)
{
    while (left < right)
    {
        char temp = *left;
        *left = *right;
        *right = temp;
        left++;
        right--;
    }
}
int main()
{
    char arr[101] = { 0 };
    gets(arr);
    int len = strlen(arr);
    reverse(arr, arr + len - 1);
    char* start = arr;

    while (*start)
    {
        char* end = start;
        while (*end != ' ' && *end != '\0')
        {
            end++;
        }
        reverse(start, end - 1);
        if (*end != '\0')
            end++;
        start = end;
    }
    printf("%s", arr);
}
发表于 2023-09-28 20:29:16 回复(0)
#include <iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
    string s1;
    getline(cin,s1);
//先整体逆置
    reverse(s1.begin(),s1.end());
//再以空格划分区间进行分段逆置回来
    //在先逆序之后最后加入有空格,防止最后一个单词找不到的情况
    s1+=" ";
    auto it=s1.begin();
    auto back= find(s1.begin(),s1.end(),' ');
    while(back!=s1.end())
    {
        reverse(it,back);
        it=back+1;
        back=find(it,s1.end(),' ');
    }
    for(auto x:s1)
    {
    cout<<x;
    }
}

发表于 2023-09-26 17:22:09 回复(0)
#include <string.h>
void reserve(char arr[], int left, int right)
{
    char m = 0;
    while (left < right)
    {
        m = arr[left];
        arr[left] = arr[right];
        arr[right] = m;
        left++;
        right--;
    }
}

int main()
{
    char arr[20];
    gets(arr);
    int left = 0;
    int mid = 0;
    int right = strlen(arr);
    reserve(arr, left, right - 1);
    while (mid - 1 != right)
    {
        while (arr[mid] != ' ' && arr[mid] != '\0')
        {
            mid++;
        }
        reserve(arr, left, mid - 1);
        mid++;
        left = mid;
    }
    int i = 0;
    for (i = 0; i < right; i++)
    {
        printf("%c", arr[i]);
    }

    return 0;
}
发表于 2023-09-09 17:46:36 回复(0)
#include <stdio.h>
#include <assert.h>
void reverse(char* left, char* right)
{
    assert(left);
    assert(right);

    while (left < right)
    {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }
}

int main()
{
    char arr[101] = {0};
    //输入
    gets(arr);
    //逆序
    int len = strlen(arr);
    //逆序字符串
    reverse(arr, arr + len - 1);
    //逆序单词
    char* start = arr;
    while(*start)
    {
        char* end = start;
        while (*end != ' ' && *end != '\0')
        {
            end++;
        }
        reverse(start, end - 1);
        if (*end != '\0')
            end++;
        start = end;
    }
    printf("%s\n", arr);
    return 0;
}
发表于 2023-09-01 22:52:32 回复(0)
//从最后一个字符开始往前找空格,遇到空格就置为'\0',
//然后从'\0'的下一个字符开始打印,得到一个单词 
#include<stdio.h>
int main()
{
    char arr[100] = { 0 };
    while (gets(arr))
    {
        int right = strlen(arr) - 1;//right是指字符串中最后一个字符的下标
        arr[right + 1] = '\0';//最后一个字符的下一个元素置为'\0',方便一会打印
        while (right >= 0)//当下标小于0停止循环
        {
            if (arr[right] == ' ')//从最后一个字符元素开始往前找,当数组元素是空格时,说明这往后是一个单词
            {
                printf("%s ", &arr[right + 1]);//空格下一个元素开始打印该单词
                arr[right] = '\0';//把空格置为'\0',方便打印下一个单词
            }
            else if (right == 0)//说明遇到了最前面的单词了
            {
                printf("%s", &arr[right]);

            }
            right--;//下标不断递减
        }
        printf("\n");
    }
    return 0;
}




编辑于 2023-08-12 21:23:33 回复(0)
#include <stdio.h>

void reverse(char* left, char* right) {

    while (left < right) {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }
}
int main() {
    char arr[101] = {0};
    gets(arr);
    int len = strlen(arr);
    //1.逆序整个字符串
    reverse(arr, arr + len - 1);
    //2.逆序单词
    char* start = arr;
    while (*start) {
        char* end = start;
        while (*end != ' '&&*end!='\0') {
            end++;
        }
        reverse(start, end - 1);
        if(*end!='\0')
        end++;
        start = end;
    }
    printf("%s", arr);
    return 0;
}

发表于 2023-07-21 17:46:47 回复(0)