Убрать лишние пробелы из строки с максимальной скоростью - C#
Формулировка задачи:
Имеем строку:
Нужно максимально быстро убрать пробелы в начале и конце строки, а внутри оставить только по одному пробелу между словами.
Я попробовал два варианта: с помощью регулярного выражения и с помощью посимвольного перебора строки и склейки в StringBuilder. В первом случае время 6,5 секунд (на 5 млн. строк), во втором случае время 3,6 секунд (на 5 млн. строк).
Как думаете, можно ли еще быстрее сделать эту операцию?
Код теста приложен:
Листинг программы
- string line = " Мама мыла раму ";
Листинг программы
- 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д