Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
Тузиков
4 / 4 / 2
Регистрация: 13.12.2011
Сообщений: 46
#1

В строке символов заменить каждый второй символ ! на $ - C#

18.10.2012, 20:39. Просмотров 3089. Ответов 15
Метки нет (Все метки)

Вот задание: В строке символов заменить каждый второй символ ! на $.
Я сделал что бы заменяло все символы "!", подскажите как сделать что б каждый второй.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
class Program
{
    static void Main(string[] args)
    {
        
        Console.WriteLine("введите строку =");
        string s = Console.ReadLine();
        {
            Console.WriteLine(s.Replace('!', '$'));
            Console.ReadKey(true);
}}}

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2012, 20:39
Я подобрал для вас темы с готовыми решениями и ответами на вопрос В строке символов заменить каждый второй символ ! на $ (C#):

Преобразовать последовательность удалив каждый символ * и повторив каждый символ отличный от *
Даны натуральное число n, символы s1,...,sn. Преобразовать последовательность...

Преобразовать строку, удалив каждый символ <*> и повторив каждый символ отличный от <*>
Дана строка. Преобразовать её, удалив каждый символ &lt;*&gt; и повторив каждый...

Поменять местами каждый четный и нечетный символ в строке
В заданной строке, имеющей четное число символов, поменять местами каждый...

Найти в файле каждый символ из строки и заменить его на соответствующие символы
Есть строка и текстовый файл, состоящий из строк вида &quot;* ***&quot;. Нужно найти в...

Написать функцию DoubleString(n), удваивающую в тексте каждый символ в строке с номером n
Подскажите а как это будет в с#? &quot;Дан текстовый файл.Написать функцию...

15
temcha
28 / 28 / 5
Регистрация: 07.09.2012
Сообщений: 119
18.10.2012, 23:55 #2
придумал вот такой алгоритм. Он не идеален, но свою задачу решает
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
 
 
class Program
{
    static void Main(string[] args)
    {
        int count = 0;
 
        Console.WriteLine("введите строку =");
        string s = Console.ReadLine();
        char[] ch = new char[s.Length];
        for (int i = 0; i < s.Length; i++)
        {
            if (s[i] == '!')
            {
                count++;
                if (count % 2 == 0)
                    ch[i] = '$';
                else ch[i] = s[i];
            }
            else ch[i] = s[i];
            
        }
        string sNew = new string(ch);
        Console.WriteLine(sNew);
    }
}
1
Тузиков
4 / 4 / 2
Регистрация: 13.12.2011
Сообщений: 46
19.10.2012, 09:39  [ТС] #3
Спасибо, очень помогли)
0
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
19.10.2012, 12:22 #4
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System;
using System.Text;
 
 
namespace ConsoleApplication33
{
    internal static class Program
    {
        private static void Main(string[] args)
        {
            string s = "Привет! Я хочу! Сделать! Это задание!";
            Console.WriteLine(s.MyReplace());
            Console.ReadKey();
        }
 
 
        private static string MyReplace(this string s)
        {
            bool flag = true;
            var sb = new StringBuilder(s.Length, s.Length);
            foreach (char c in s)
                sb.Append(c == '!' && (flag = !flag) ? '$' : c);
            return sb.ToString();
        }
    }
}
Добавлено через 20 минут
8 строк кода)
0
NightmareZ
1422 / 611 / 57
Регистрация: 31.03.2009
Сообщений: 1,978
19.10.2012, 13:49 #5
В одну строку, хе-хе

C#
1
s = s.Aggregate(new { s = "", f = false }, (a, c) => new { s = a.s + (c == '!' && a.f ? '$' : c), f = c == '!' ? !a.f : a.f}).s;
0
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
19.10.2012, 13:52 #6
NightmareZ, дублирование кода - отказать
0
NightmareZ
1422 / 611 / 57
Регистрация: 31.03.2009
Сообщений: 1,978
19.10.2012, 14:01 #7
Цитата Сообщение от Psilon Посмотреть сообщение
NightmareZ, дублирование кода - отказать
Да лааадно тебе, дублирование... лишний условный оператор погоды не сыграет.

Добавлено через 3 минуты
C#
1
s = s.Aggregate(new { s = "", f = false }, (a, c) => c == '!' ? new { s = a.s + (a.f ? '$' : c) , f = !a.f } : new { s = a.s + c, f = a.f }).s;
0
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
19.10.2012, 14:01 #8
NightmareZ, затести стопотчером, мой вариант 100% быстрее
0
NightmareZ
1422 / 611 / 57
Регистрация: 31.03.2009
Сообщений: 1,978
19.10.2012, 14:02 #9
Цитата Сообщение от Psilon Посмотреть сообщение
NightmareZ, затести стопотчером, мой вариант 100% быстрее
И не сомневаюсь Я не удивлюсь, если он в разы быстрее
1
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
19.10.2012, 14:09 #10
NightmareZ, да я уже писал проги, которые были на 4-5 порядков быстрее, чем предложенные тут варианты Так что в разы - мелко для меня)
1
Konctantin
938 / 742 / 170
Регистрация: 12.04.2009
Сообщений: 1,700
19.10.2012, 22:27 #11
Ну если уж речь идет о скорости, то почему же нам не вспомнить про указатели, будет еще быстрее:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
static unsafe void Main(string[] args)
{
    Func<string, string> repluns = (str) =>
        {
            var flag = true;
            var len = str.Length;
            fixed (char* p = str)
            {
                char* arr = stackalloc char[len];
                for (int i = 0; i < len; ++i)
                    *(char*)(arr + i) = *(char*)(p + i) == '!' && (flag = !flag) ? '$' : *(char*)(p + i);
                return new string(arr, 0, len);
            }
        };
 
    Func<string, string> repsafe = (str) =>
        {
            bool flag = true;
            var sb = new StringBuilder(str.Length, str.Length);
            foreach (char c in str)
                sb.Append(c == '!' && (flag = !flag) ? '$' : c);
            return sb.ToString();
        };
 
    var stopWatch = new Stopwatch();
    var r = new Random();
    var content = new StringBuilder(100000, 1000000);
 
    for (int i = 0; i < 100000; ++i)
        content.Append(r.Next(35, 90));
 
    var s = content.ToString();
 
    stopWatch.Start();
    repsafe(s);
    stopWatch.Stop();
    Console.WriteLine(stopWatch.ElapsedTicks);
 
    stopWatch.Reset();
 
    stopWatch.Start();
    repluns(s);
    stopWatch.Stop();
    Console.WriteLine(stopWatch.ElapsedTicks);
 
    Console.ReadLine();
}
результат:
Код
10771
4915
1
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
19.10.2012, 23:12 #12
Konctantin, это мой же код, просто переписанный на указателях Вопрос был в алгоритме)) Если предложите что-то быстрее - пожалуйста.
0
Konctantin
938 / 742 / 170
Регистрация: 12.04.2009
Сообщений: 1,700
19.10.2012, 23:16 #13
ну а что в нем нового? я ничего и не выдумывал, просто начали говорить о скорости, вот я вам и напомнил о еще больших скоростях.
0
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
19.10.2012, 23:23 #14
Konctantin, не доводите до абсурда, давайте еще про подключение библиотек на неуправляемом коде или вообще асме поговорим.
0
Konctantin
938 / 742 / 170
Регистрация: 12.04.2009
Сообщений: 1,700
19.10.2012, 23:40 #15
хм... а в чем собственно абсурд? в данном случае все родное. памяти сжыраем меньше, меньше делаем проверок и преобразований. мы ничего не подключаем, ничего не городим. в чем абсурд?.

ЗЫ. Я частенько пользуюсь указателями, когда речь идет о быстродействии и больших объемах.
0
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
19.10.2012, 23:40 #16
Konctantin, unsafe в шарпе не приветствуется... Не спорю, быстрее. Но разница не столь существена, чтобы лезть в отдельные настройки проекта ради возможности компиляции.
0
19.10.2012, 23:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2012, 23:40
Привет! Вот еще темы с решениями:

Заменить 1 символ на 2 в строке
Здравствуйте! Подскажите как можно заменить 1 символ в строке на 2, если более...

Заменить символ в строке
Как вычленить символ и строки и преобразовать его в верхний регистр, но чтобы...

Заменить последние N символов массива на символ С
Статический метод: вход - число N. Выход - новый массив, содержащий N символов...

Найти и заменить символ в строке в файле
Есть файл с текстом, в каждой строке есть несколько знаков &quot;-&quot;, нужно заменить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru