diff --git a/work20220401/.idea/.gitignore b/work20220401/.idea/.gitignore new file mode 100644 index 0000000..1c2fda5 --- /dev/null +++ b/work20220401/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/work20220401/.idea/deployment.xml b/work20220401/.idea/deployment.xml new file mode 100644 index 0000000..771f492 --- /dev/null +++ b/work20220401/.idea/deployment.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/work20220401/.idea/misc.xml b/work20220401/.idea/misc.xml new file mode 100644 index 0000000..f1c67df --- /dev/null +++ b/work20220401/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/work20220401/.idea/modules.xml b/work20220401/.idea/modules.xml new file mode 100644 index 0000000..e2f5241 --- /dev/null +++ b/work20220401/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/work20220401/.idea/vcs.xml b/work20220401/.idea/vcs.xml new file mode 100644 index 0000000..2e3f692 --- /dev/null +++ b/work20220401/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/work20220401/.idea/work20220401.iml b/work20220401/.idea/work20220401.iml new file mode 100644 index 0000000..6d70257 --- /dev/null +++ b/work20220401/.idea/work20220401.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/work20220401/CMakeLists.txt b/work20220401/CMakeLists.txt new file mode 100644 index 0000000..d337362 --- /dev/null +++ b/work20220401/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.21) +project(work20220401) + +set(CMAKE_CXX_STANDARD 14) + +add_executable(work20220401 main.cpp neoString/CString.cpp neoString/CString.h) diff --git a/work20220401/main.cpp b/work20220401/main.cpp new file mode 100644 index 0000000..50a9e1d --- /dev/null +++ b/work20220401/main.cpp @@ -0,0 +1,29 @@ +#include "iostream" +#include "neoString/CString.h" + +using namespace std; + +int main() { + int n, i, j; + while (cin >> n) { + CString *c = new CString[n + 2]; + for (i = 0; i < n; i++) { + cin >> c[i]; + } + for (i = 0; i < n - 1; i++) { + for (j = 0; j < n - i - 1; j++) { + if (c[j] > c[j + 1]) { + c[n] = c[j]; + c[j] = c[j + 1]; + c[j + 1] = c[n]; + } + } + } + for (i = 0; i < n; i++) { + c[n + 1] += c[i]; + } + cout << c[n + 1] << endl; + delete[] c; + } + return 0; +} \ No newline at end of file diff --git a/work20220401/neoString/CString.cpp b/work20220401/neoString/CString.cpp new file mode 100644 index 0000000..3aa1b71 --- /dev/null +++ b/work20220401/neoString/CString.cpp @@ -0,0 +1,127 @@ +// +// Created by lenfrex on 2022/4/4. +// + +#include +#include "CString.h" + +/* + * 按照给定大小来初始化字符串数据 + */ +CString::CString(int length) { + data = new char[length](); + CString::length = length; +} + +CString::~CString() { + delete[] data; +} + +/* + * 不设定初始化大小就默认512个字符来初始化 + */ +CString::CString() : CString(512) {} + +/* + * 重载等号。借鉴了Java中String类的equal()方法的实现。 + * 首先比较两字符串长度,如果长度不一样不用说,直接返回false;如果data为nullptr,不做比较并返回false + * 相同的话再比较两字符串数据指针指向地址是否一样,一样就代表指向的是同一块内存,直接返回true + * 两者都不同才进行逐字比较 + */ +bool CString::operator==(const CString &source) const { + // 判断两CString长度以及本对象data成员是否为空指针 + if (source.length != length || data == nullptr) { + return false; + } else { + // 判断两对象data成员是否指向同一内存块 + if (source.data == data) { + return true; + } + } + + // 以上情况都不符合时才进行逐字比较 + int compareLength = source.length < length ? source.length : length; + for (int i = 0; i < compareLength; ++i) { + if (data[i] != source.data[i]) { + return false; + } + } + return true; +} + +/* + * 从源中复制字符串来构建新的对象 + */ +CString::CString(char *source) : CString((int)strlen(source)) { + strncpy(data, source, length); +} + +/* + * 从源中复制字符串来构建新的对象,并定义初始长度,小于源字符串则会被截取 + */ +CString::CString(char *source, int length) : CString(length) { + strncpy(data, source, length); +} + +CString &CString::operator=(const CString &source) { + // 处理自己给自己赋值的情况,那叫啥,自赋值 + if (this == &source) { + return *this; + } + + if (data != nullptr && length != 0) { + delete[] data; + } + + this->length = source.length; + this->data = new char[length](); + + strncpy(data, source.data, length); + + return *this; +} + +CString &CString::operator+=(const CString &source) { + if (data == nullptr && length == 0) { + this->length = source.length; + this->data = new char[length](); + } + + char *tmp = new char[length](); + strncpy(tmp, data, length); + + // 重新分配内存,防止拼接后溢出 + delete[] data; + this->length += source.length; + this->data = new char[this->length]; + + strcpy(tmp, data); + strncat(data, source.data, source.length); + + return *this; +} + +CString::CString(const CString &source) : CString(source.data, source.length) {} + +/* + * 按照字典顺序逐字对比 + */ +bool CString::operator<(const CString &source) const { + // 这部分类似于前边==重载的前置判断 + if (source.length != length || data == nullptr) { + return false; + } else { + if (source.data == data) { + return true; + } + } + + // 以上情况都不符合时才进行逐字比较 + int compareLength = source.length < length ? source.length : length; + for (int i = 0; i < compareLength; ++i) { + if (data[i] < source.data[i]) { + return true; + } + } + return false; +} diff --git a/work20220401/neoString/CString.h b/work20220401/neoString/CString.h new file mode 100644 index 0000000..940217b --- /dev/null +++ b/work20220401/neoString/CString.h @@ -0,0 +1,38 @@ +// +// Created by lenfrex on 2022/4/4. +// + +#ifndef WORK20220401_CSTRING_H +#define WORK20220401_CSTRING_H + +#include "utility" + +using namespace std::rel_ops; +class CString { +private: + char *data = nullptr; + int length = 0; +public: + explicit CString(int length); + + CString(char *data, int length); + + explicit CString(char *source); + + CString(const CString &source); + + CString(); + + ~CString(); + + bool operator==(const CString &source) const; + + bool operator<(const CString &source) const; + + CString &operator+=(const CString &source); + + CString &operator=(const CString &source); +}; + + +#endif //WORK20220401_CSTRING_H