diff options
feat(Week11): Add solutions
1 files changed, 64 insertions, 0 deletions
| -rw-r--r-- | Week11/Exercise03.cpp | 64 |
diff --git a/Week11/Exercise03.cpp b/Week11/Exercise03.cpp new file mode 100644 index 0000000..3620061 --- /dev/null +++ b/Week11/Exercise03.cpp @@ -0,0 +1,64 @@ +#include <iostream> + +unsigned fieldsCount(const char* str) { + // Едно поле не съдържа шпации, което реално означава, че + // всяко поле ще бъде заобиколено от шпации (с леко изключение + // на първото и последното поле). + // + // В такъв случай, можем да кажем, че началото на поле се "маркира" + // с първата не-шпация след редица от шпации. Тоест, ако текущия + // знак не е шпация, достатъчно е да погледнем предходния знак, за да + // разберем дали сме започнали поле или сме по средата на поле. + // + // И за нашата задача, остава само да преборим тези начала, което е + // същото като броя полета. Допълнително, ако инициализираме + // предходната буква да е шпация, тогава винаги ще преборим първото + // поле. + // + // Да, задачата може да се реши без запазването на целия низ. + + unsigned count = 0; + + char prev = ' '; + char curr = *(str++); + + while (curr != '\0') { + count += prev == ' ' && curr != ' '; + + prev = curr; + curr = *(str++); + } + + return count; +} + +int main() { + unsigned allocated = 8, size = 0; + char* sentence = new char[allocated]; + + char curr; + std::cin.get(curr); + while (curr != '.') { + sentence[size++] = curr; + std::cin.get(curr); + + // Реоразмеряване + if (size >= allocated) { + allocated *= 2; + char* newSentenceArray = new char[allocated]; + + for (unsigned i = 0; i < size; i++) + newSentenceArray[i] = sentence[i]; + + delete[] sentence; + sentence = newSentenceArray; + } + } + sentence[size] = '\0'; + + std::cout << fieldsCount(sentence) << std::endl; + + delete[] sentence; + + return 0; +} |
