Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Stick
4 / 4 / 1
Регистрация: 26.11.2009
Сообщений: 143
Завершенные тесты: 2
1

Инкремент значения строки

26.01.2017, 15:19. Просмотров 948. Ответов 12
Метки нет (Все метки)

Здравствуйте!
Есть строка
AB
нужно увеличить эти символы в лексикографическом значении: например АВ + 2 = AD
При переходе через "Z" ведущие символы должны тоже увеличиваться AZ + 3 = BC
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2017, 15:19
Ответы с готовыми решениями:

Инкремент значения переменной
Уважаемые форумчане, разъясните пожалуйста ответ компилятора int i = 3; ...

Постфиксный и префиксный инкремент
Однажды задумался и захотел стать программистом. Зашибать по 300к в секунду....

Префиксный/постфиксный инкремент
Почему следующий код выводит на консоль 13 - понятно (т.к. в первую очередь...

Инкремент повторяющегося числа
Добрый день. Нужно решить одну небольшую задачку, для формирования XML, но у...

Как изменить инкремент?
Всем привет, надо вычислить значение функции, т.е. есть система уравнений, надо...

12
Pikemaster
298 / 298 / 215
Регистрация: 24.09.2013
Сообщений: 769
Завершенные тесты: 4
26.01.2017, 15:42 2
Stick,
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
using System;
using System.Text;
 
class Program
{
    public static void Main()
    {
        string text = "AB";
        Console.WriteLine(Increment(text, 10));
        Console.ReadKey();
    }
 
    static string Increment(string target, int num)
    {
        StringBuilder sb = new StringBuilder(target);
        for (int i = target.Length - 1; i >= 0; i--)
        {
            while (sb[i] != 'Z' && num > 0)
            {
                sb[i] = (char)(sb[i] + 1);
                num--;
            }
        }
 
        if (num > 0)
        {
            for (int i = 0; i < num / 26; i++)
                sb.Insert(0, 'Z');
            sb.Insert(0, (char)(num % 26 + 64));
        }   
        return sb.ToString();
    }
}
1
ata
270 / 242 / 186
Регистрация: 28.10.2015
Сообщений: 709
26.01.2017, 15:54 3
Фактически речь идет о 26-ричной системе счисления. Поэтому самый простой путь - переводить строку в число, увеличивать и переводить обратно в строку. Или представлять число в виде массива байтов, а из строки в массив и из массива в строку тоже переводить двумя функциями. Строки вообще не подходят для их изменения, они иммутабельны.
0
Stick
4 / 4 / 1
Регистрация: 26.11.2009
Сообщений: 143
Завершенные тесты: 2
27.01.2017, 12:02  [ТС] 4
Pikemaster, а если исходная строка AZZ, то результат BZZ, вместо BAA.
0
Pikemaster
298 / 298 / 215
Регистрация: 24.09.2013
Сообщений: 769
Завершенные тесты: 4
27.01.2017, 12:45 5
Stick, невнимательно прочитал задание.
Видимо тогда лучше использовать метод, который предложил ata.

Добавлено через 21 минуту
Stick, хотя можно и так
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
static string Increment(string target, int num)
{
    StringBuilder sb = new StringBuilder(target);
    for (int i = 0; i < num; i++ )
    {
        if (sb[sb.Length - 1] == 'Z')
        {
            sb[sb.Length - 1] = 'A';
            for (int j = sb.Length - 2; j >= 0; j--)
            {
                if (sb[j] < 'Z')
                {
                    sb[j] = (char)(sb[j] + 1);
                    break;
                }
                else
                    sb[j] = 'A';
            }
        }
        else 
            sb[sb.Length - 1] = (char)(sb[sb.Length - 1] + 1);
    }
    return sb.ToString();
}
0
ata
270 / 242 / 186
Регистрация: 28.10.2015
Сообщений: 709
28.01.2017, 09:26 6
Лучший ответ Сообщение было отмечено Stick как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Linq;
using System.Collections.Generic;
 
public class Kata
{
    public static void Main()
    {
        string s = "ZZZ";
        Stack<int> digits = new Stack<int>(s.Length + 1);
        int previous = 1;
        foreach (char ch in s.Reverse())
        {
            int digit = ch - 'A' + previous;
            previous = digit / 26;
            digits.Push(digit % 26);
        }
        if (previous != 0) digits.Push(previous);
        Console.WriteLine(new String(digits.Select(d => (char)(d + 'A')).ToArray()));
    }
}
Код получился почти универсальным. Его чуть-чуть доработать (заменить последнее условие на цикл), и он будет складывать со строкой любые числа. Попробуйте, например, задать s = "AA" и previous = 26.
1
Stick
4 / 4 / 1
Регистрация: 26.11.2009
Сообщений: 143
Завершенные тесты: 2
31.01.2017, 10:27  [ТС] 7
ata, изящно получилось!

Добавлено через 11 минут
ata, что-то не получается: если взять s = "Z" и previous = 3 получаю BC, вместо АС
0
TopLayer
785 / 584 / 302
Регистрация: 23.10.2016
Сообщений: 1,389
Завершенные тесты: 7
31.01.2017, 10:45 8
C#
1
if (previous != 0) digits.Push(previous - 1);
2
Stick
4 / 4 / 1
Регистрация: 26.11.2009
Сообщений: 143
Завершенные тесты: 2
31.01.2017, 11:18  [ТС] 9
Можно ли сравнить в лексикографическом порядке строки "BE" и "BDDD". И при этом узнать какая строка меньше?
C#
1
2
3
4
5
6
7
8
if (String.CompareOrdinal("BE", "BDDD") != 1)
{
   // BE меньше
}
else
{
   // BDDD больше
}
не слишком помогает это условие.
0
Usaga
Эксперт .NET
5013 / 3339 / 597
Регистрация: 21.01.2016
Сообщений: 13,156
Завершенные тесты: 2
31.01.2017, 11:22 10
Stick, CompareOrdinal возвращает отрицательное число, 0 и положительное число. Твоё сравнение бессмысленно.
0
Stick
4 / 4 / 1
Регистрация: 26.11.2009
Сообщений: 143
Завершенные тесты: 2
31.01.2017, 11:50  [ТС] 11
Usaga, есть ли класс или метод который мне поможет?
0
Usaga
Эксперт .NET
5013 / 3339 / 597
Регистрация: 21.01.2016
Сообщений: 13,156
Завершенные тесты: 2
31.01.2017, 11:57 12
Stick, да, это - String.CompareOrdinal.
0
Stick
4 / 4 / 1
Регистрация: 26.11.2009
Сообщений: 143
Завершенные тесты: 2
31.01.2017, 12:44  [ТС] 13
Usaga, все ясно! Для понимания не хватало плотного обеда
0
31.01.2017, 12:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2017, 12:44

Одновременный инкремент в многопоточной программе
Подпрограмма выполняется в многопоточном режиме. i, j - глобальные...

Инкремент и декремент без циклов
Доброго времяни суток - как можно решить такую задачку без использования циклов...

Префиксный инкремент в качестве аргумента метода
Уходит в бесконечный цикл. Причем если использовать постфиксную форму то все...


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

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

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