Убрать лишние пробелы из строки с максимальной скоростью - C#

Узнай цену своей работы

Формулировка задачи:

Имеем строку:
string line = "    Мама  мыла                 раму     ";
Нужно максимально быстро убрать пробелы в начале и конце строки, а внутри оставить только по одному пробелу между словами. Я попробовал два варианта: с помощью регулярного выражения и с помощью посимвольного перебора строки и склейки в StringBuilder. В первом случае время 6,5 секунд (на 5 млн. строк), во втором случае время 3,6 секунд (на 5 млн. строк). Как думаете, можно ли еще быстрее сделать эту операцию? Код теста приложен:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text.RegularExpressions;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            Regex reSpaces = new Regex(" {2,}", RegexOptions.Compiled);
 
            DateTime start = DateTime.Now;
 
            string line = "    Мама  мыла                 раму     ";
            string result = null;
 
            for (int i = 0; i < 5000000; i++)
            { 
                //1. С помошью регулярного выражения + Trim = 6,5 секунд
                //result = reSpaces.Replace(line, " ");
                //result = result.TrimEnd().TrimStart();
                
                //2. С помощью разделение строки и обратной склейки = 3,6 секунд
                result = CompactWhitespaces(line);
            }
 
            DateTime end = DateTime.Now;
            MessageBox.Show(result);
            MessageBox.Show((end - start).TotalSeconds.ToString());
 
        }

        public static String CompactWhitespaces(String s)
        {
            StringBuilder sb = new StringBuilder(s);
 
            CompactWhitespaces(sb);
 
            return sb.ToString();
        }
 
        public static void CompactWhitespaces(StringBuilder sb)
        {
            if (sb.Length == 0)
                return;
 
            int start = 0;
 
            while (start < sb.Length)
            {
                if (Char.IsWhiteSpace(sb[start]))
                    start++;
                else
                    break;
            }
 
            if (start == sb.Length)
            {
                sb.Length = 0;
                return;
            }
 
            int end = sb.Length - 1;
 
            while (end >= 0)
            {
                if (Char.IsWhiteSpace(sb[end]))
                    end--;
                else
                    break;
            }
 
            int dest = 0;
            bool previousIsWhitespace = false;
 
            for (int i = start; i <= end; i++)
            {
                if (Char.IsWhiteSpace(sb[i]))
                {
                    if (!previousIsWhitespace)
                    {
                        previousIsWhitespace = true;
                        sb[dest] = ' ';
                        dest++;
                    }
                }
                else
                {
                    previousIsWhitespace = false;
                    sb[dest] = sb[i];
                    dest++;
                }
            }
 
            sb.Length = dest;
        }
    }
}

Решение задачи: «Убрать лишние пробелы из строки с максимальной скоростью»

textual
Листинг программы
FUNC = Suppir   RESULT = 00:00:02.7561602
FUNC = cws      RESULT = 00:00:00.6289758
FUNC = Psylon   RESULT = 00:00:00.7196369
FUNC = FastCompactWhitespaces   RESULT = 00:00:00.7681129

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.667 из 5
Похожие ответы