• 字符串反转C#的实现


    字符串反转是面试过程中出现频率较高的算法题,今天一个牛同事让我用C#帮他实现这个算法,前提当然是不能使用类库。

    例如: how are you 的反转结果为 you are how.

    算法1: 是我当场写的一个不太理想的算法,虽然不太理想,但思路很直接:

    1. 申请一个新的字符数组,新字符数组大小与源字符串等长度。

    2. 将源字符串从末尾向前端进行遍历。将每一个单词加入新字符数组。

           使用变量count记录当前单词长度。即,

             若字符非空格,count++;

             若字符是空格,则将原数组从当前位置开始的count个字符加入到新数组中。

            static void Main(string[] args)
            {
                string testString = "how are you";
    
                var result = reverseString(testString);
    
            }
    
            static char[] reverseString(string value)
            {
                
                if (string.IsNullOrEmpty(value))
                    return new char[] { };
    
                int length = value.Length;
                char[] result = new char[length];
                int count = 0;
                int rIndex = 0;
                for (int i = length-1; i>=0; i--)
                {
                    if(value[i]!=' ')
                    { count++; }
    
                    if(value[i]==' ')
                    {
                        int index = i + 1;
                        for(; index< i+count+1; index++)
                        {
                            result[rIndex++] = value[index];
                        }
                        count = 0;
                        result[rIndex++] = ' ';
                    }               
                           
                }
    
                // fot the first word
                foreach (char c in value)
                {
                    if (c != ' ')
                        result[rIndex++] = c;
                    else
                        break;
                }
    
                return result;
            }
           
        }


    算法2: 今天下班前,又花了1个小时重新考虑了这个问题,其实要实现空间开销最小,时间复杂度最低,可以实现一个字符数组反转程序。 思路如下:

    1. 先将整个元字符数组反转, 得到 uoy era woh.

    2. 再将每个单词进行反转, 同样使用空字符分割单词。

    注意:字符数组反转函数,1. 不需要遍历所有字符,仅仅遍历二分之一的字符即可。 2. 用left, right控制字符数组中反转字符的起始位置。

    namespace reverseWords
    {
        /// <summary>
        /// Qijie Xue
        /// </summary>
        class Program
        {
            static void Main(string[] args)
            {
                string testData = "how are you now";
                var result = reverseString2(testData);
            }
    
            static char[] reverseString2(string value)
            {
                char[] ochr = value.Trim().ToString().ToArray();
                ochr = reverseChar(ref ochr, 0, ochr.Length - 1);
                
                int start = 0;
                int end = 0;
                for(int i = 0; i<ochr.Length; i++)
                {
                    if(ochr[i]==' ')
                    {
                        end = i - 1;
                        reverseChar(ref ochr, start, end);
                        start = i + 1;
                    }
    
                    if(i==ochr.Length - 1)
                    {
                        end = ochr.Length - 1;
                        reverseChar(ref ochr, start, end);
                    }
                }
    
                return ochr;
            }
    
            static char[] reverseChar(ref char[] ochr, int left, int right)
            {     
                int mid = (right + left) >> 1;
    
                int l = 0;
                int r = 0;
    
                //even numbers, l = mid, r = mid + 1
                //odd numbers, l = mid - 1, r = mid + 1
                if ((right - left + 1) % 2 == 0)
                {
                    l = mid + 1;
                    r = mid;
                }
                else
                {
                    l = r = mid;
                }
    
                while (l > left)
                {
                    l--;
                    r++;
                    char tchr = ochr[l];
                    ochr[l] = ochr[r];
                    ochr[r] = tchr;
                }
    
                return ochr;
            }
    
        }
    }
    View Code

    以上两种算法,都需要将源字符串两端的空字符去掉。

  • 相关阅读:
    Ubuntu安装qBittorrent
    资深程序猿冒死揭开软件潜规则:无法维护的代码
    Oracle11g Active Data Guard搭建、管理
    Android 扁平化button
    Eclipse Android 代码自己主动提示功能
    Echoprint系列--编译
    一步步玩pcDuino3--mmc下的bootloader
    【Discuz】去除版权信息,标题栏与底部改动
    phoenixframe自己主动化測试平台对div弹出框(如弹出的div登陆框)的处理
    UVa
  • 原文地址:https://www.cnblogs.com/qixue/p/5532824.html
Copyright © 2020-2023  润新知