倒置字符数组中的字符

问题:如何把字符串 “We are the world” 转成 “world the are we” ?如果最多只能用两个额外的变量又该如何实现这样的转换?

分析:1.把字符串转成字符数组,然后对字符数组进行操作。

2.选择倒置字符数组的方法:用一个临时变量temp来交换两个字符,然后依次移动数组中的其他元素;利用 A=A+B, B=A-B, A=A-B 方式来交换两个字符。

3.根据数组中首尾字符的位置来倒置它们之间的字符。

4.优化方法:减少循环的次数,减少变量的个数。

C#代码

using System.Linq;namespace MyTest
{    /// <summary>
    /// 用最少的变量和最高的效率实现:    /// 把"we are the world"倒置成"world the are we"    /// </summary>
    public class Program
    {        static void Main(string[] args)
        {            //待处理的字符串
            string myStr = "we are the world";

            System.Console.WriteLine("原始字符串:{0}", myStr);
            System.Console.WriteLine("一般方法的处理结果:{0}", ReverseOld(myStr.ToArray()));
            System.Console.WriteLine("改进方法的处理结果:{0}", ReverseNew(myStr.ToArray()));

            System.Console.ReadKey();
        }        /// <summary>
        /// 倒置字符数组,一般方法        /// 缺点:1.利用了多个变量,如temp,start,循环变量i,j        /// 2.最高有三层循环        /// </summary>
        /// <param name="arr">被倒置的字符数组</param>
        /// <returns>倒置后的字符数组</returns>
        static string ReverseOld(char[] arr)
        {            //暂存数组中的某个字符
            char temp = ‘ ‘;            //倒置某个单词时需要一个起始位置
            int start = -1;            //第一步:倒置整个字符数组
            for (int i = 0; i < arr.Length; i++)
            {
                temp = arr[arr.Length - 1];                for (int j = 0; j < arr.Length - i - 1; j++)
                {
                    arr[arr.Length - j - 1] = arr[arr.Length - j - 2];
                }
                arr[i] = temp;
            }            //第二步:倒置字符数组中的空格前的某个单词            
            for (int i = 0; i < arr.Length; i++)
            {                //遇到一个空格,就倒置空格前的一个单词
                if (arr[i] == ‘ ‘)
                {                    for (int j = start + 1; j < i; j++)
                    {
                        temp = arr[i - 1];                        for (int k = 0; k < i - j - 1; k++)
                        {
                            arr[i - k - 1] = arr[i - k - 2];
                        }
                        arr[j] = temp;
                    }
                    start = i;
                }
            }            //第三步:倒置字符数组中的最后一个单词
            for (int i = arr.Length - 1; i >= 0; i--)
            {                //遇到一个空格,就倒置空格前的一个单词
                if (arr[i] == ‘ ‘)
                {                    for (int j = i + 1; j < arr.Length - 1; j++)
                    {
                        temp = arr[arr.Length - 1];                        for (int k = 0; k < arr.Length - i - 2; k++)
                        {
                            arr[arr.Length - k - 1] = arr[arr.Length - k - 2];
                        }
                        arr[j] = temp;
                    }                    //最后一个单词倒置完毕,跳出循环
                    break;
                }
            }            //返回字符串
            return new string(arr);
        }        /// <summary>
        /// 倒置字符数组,改进后的方法        /// 改进地方:1.只利用一个额外的变量start和一个循环变量end        /// 2.循环次数大大减少        /// </summary>
        /// <param name="arr">被倒置的字符数组</param>
        /// <returns>倒置后的字符数组</returns>
        static string ReverseNew(char[] arr)
        {            //第一步:把整个字符数组倒置
            reverseWord(arr, 0, arr.Length);            //记录某个单词的起始位置
            int start = 0;            //第二步:依次倒置字符数组中的某个单词(不包括最后一个单词)
            for (int end = 0; end < arr.Length; end++)
            {                if (arr[end] == ‘ ‘)
                {
                    reverseWord(arr, start, end);
                    start = end + 1;
                }
            }            //第三步:倒置字符数组中的最后一个单词
            for (int end = arr.Length - 1; end > 0; end--)
            {                if (arr[end] == ‘ ‘)
                {
                    reverseWord(arr, end + 1, arr.Length);                    break;
                }
            }            //返回字符串
            return new string(arr);
        }        /// <summary>
        /// 倒置字符数组中,起始位置和结束位置之间的字符        /// </summary>
        /// <param name="arr">字符数组</param>
        /// <param name="start">起始位置</param>
        /// <param name="end">结束位置</param>
        static void reverseWord(char[] arr, int start, int end)
        {            //倒置整个字符数组
            for (int i = start; i < (start + end) / 2; i++)
            {                //交换两个整型变量的思路: a = a + b, b = a - b, a = a - b
                arr[i] = (char)(arr[i] + arr[start + end - i - 1]);
                arr[start + end - i - 1] = (char)(arr[i] - arr[start + end - i - 1]);
                arr[i] = (char)(arr[i] - arr[start + end - i - 1]);
            }
        }
    }
}

 运行结果

原始字符串:we are the world

一般方法的处理结果:world the are we

改进方法的处理结果:world the are we

时间: 2024-10-07 14:51:10

倒置字符数组中的字符的相关文章

从字符数组中删除字符

/*实现程序的功能:从字符数组s中删除存放在c中的字符.*/ #include <stdio.h> int main(int argc, const char *argv[]) { char s[80],c; printf("请输入一个字符串\n"); gets(s); printf("请输入一个字符\n"); scanf("%c",&c); //遍历字符串 for (int i = 0; s[i] != '\0'; i++)

将数组中的字符按出现次数多少排序输出

原题 一个有N个元素的集合,其中有相同元素. 需要得到按重复元素多少排序的新集合. 输入  {"a","b","c","c","a","c"} 输出  {"c","a","b"} 求算法 import java.util.ArrayList; import java.util.Collections; import java.u

C:函数:功能:实现字符数组中所有字母的倒序存放并输出

前两天小测碰到一道题,建立一个函数,功能:实现字符数组中所有字母的倒序存放并输出,一开始觉得简单跟数字数组差不多,运行一下发现很多格式错误,这些是不必要的错误,现在就来说下,先说一下代码思路:定义一个字符数组假如有n个字符,让一个指针变量*p指向首地址,*(p+n-1)就是末地址,然后实现*p与*(p+n-1)值的互换,这边让*q=*(p+n-1)每换一次,p++,q--,当p>q时退出循环,我们来看下代码: 1 #include "stdio.h" 2 char change(

字符串分割到二维字符数组中:

/* *字符串分割,把一个长的字符串(可能有空格),分割到一个二维字符数组中. *并且输出 * *时间复杂度O(N) *注意在操作二维字符串数组时:使用"数组指针"操作能方便 int(*p)[LEN]; * */ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<stdbool.h> #define NDEBUG #include<assert.h>

LeetCode | 1408. String Matching in an Array数组中的字符串匹配【Python】

LeetCode 1408. String Matching in an Array数组中的字符串匹配[Easy][Python][字符串] Problem LeetCode Given an array of string words. Return all strings in words which is substring of another word in any order. String words[i] is substring of words[j], if can be o

《Python CookBook2》 第一章 文本 - 检查字符串中是否包含某字符集合中的字符 &amp;&amp; 简化字符串的translate方法的使用

检查字符串中是否包含某字符集合中的字符  任务: 检查字符串中是否出现了某个字符集合中的字符 解决方案: 方案一: import itertools def containAny(seq,aset): for item in itertools.ifilter(aset.__contains__,seq): return True return False if __name__ == "__main__": l1 = list('python') l2 = set('x') prin

20.4.12 周赛 数组中的字符串匹配 简单

题目 给你一个字符串数组 words ,数组中的每个字符串都可以看作是一个单词.请你按 任意 顺序返回 words 中是其他单词的子字符串的所有单词. 如果你可以删除 words[j] 最左侧和/或最右侧的若干字符得到 word[i] ,那么字符串 words[i] 就是 words[j] 的一个子字符串. 示例 1: 输入:words = ["mass","as","hero","superhero"] 输出:["

改正字符数组中的内容

有一个字符数组的内容为:"student a am i", 请你将数组的内容改为"i am a student". 要求: 不能使用库函数. 只能开辟有限个空间(空间个数和字符串的长度无关). student a am i i ma a tneduts i am a student 1 #include<stdio.h> 2 3 void reverse_string(char* start, char* end) 4 { 5 while (start

常量字符 数组 与常量字符 串

常量字符数组与常量字符串: const char str1[] = "abc"; const char str2[] = "abc"; const char *p1 = "abc"; const char *p2 = "abc"; printf("%d %d %d %d\n",str1, str2,p1,p2); 结果是什么? 前两个是字符数组,定义在栈上,明显地址不同 字符串常量定义在静态区,仅有一份拷贝