#include <iostream>
#include <string>
#include <map>
using namespace std;
char FirstNoneRepeat(string str); //반복되지 않는 첫번쨰 문자 찾기(map)
string FlipString(string str); //문자열 뒤집기(전체)
string FlipString(int start, int end, string& str); //원하는 자리만큼 flip
string RemoveChar(string str, string rev); // 문자열에서 특정 문자 없애기
string FlipWordBuf(string str); //단어뒤집기 임시버퍼 사용
string FlipWordNoBuf(string str); //단어뒤집기 기존 문자열사용
string IntToString(int num); //정수형을 문자열로 음수체크
int StringToInt(string str); //문자열을 정수로 음수체크
int main(void)
{
string str = "Pacific War: Battle of Midway.";
string rev = "aeiou";
string flipStr = "Remember me, for centuries.";
string sNum = "-12345";
string repeatStr = "tomato";
int num = -123;
cout <<"반복되지않는 문자: "<<FirstNoneRepeat(repeatStr) << endl;
cout << RemoveChar(str, rev) << endl;
cout << StringToInt(sNum) << endl;
cout<< IntToString(num) << endl;
cout << FlipString(flipStr) << endl;
cout<< FlipWordBuf(flipStr) << endl;
cout << FlipWordNoBuf(flipStr) << endl;
return 0;
}
char FirstNoneRepeat(string str)
{
map<char, int> *hash = new map<char, int>();
int length = str.length();
for (int i = 0; i < length; i++)
{
auto it = hash->find(str[i]);
if (it != hash->end())
{
++(it->second);
}
else
{
hash->emplace(str[i], 1);
}
}
for (auto arr : *hash)
{
if (arr.second == 1)
{
return arr.first;
}
}
return 0;
}
string FlipString(string str)
{
int length = str.length();
for (int i = 0; i < length / 2; i++)
{
auto tmp = str[i];
str[i] = str[length - 1 - i];
str[length - 1 - i] = tmp;
}
return str;
}
string RemoveChar(string str, string rev)
{
int src = 0, dst = 0;
bool flag[128] = { false, }; //아스키코드 기준
for (src = 0; src < rev.length(); ++src)
{
flag[rev[src]] = true;
}
//flag 해당 문자열 true
for (src = 0; src < str.length(); ++src)
{
if (!flag[str[src]])
{
str[dst] = str[src];
dst++;
}
}
string result(str, 0, dst);
return result;
}
string FlipWordBuf(string str)
{
int len = str.length();
int tokenPos = len - 1;
int writePos = 0;
int readPos, endPos = 0;
char* buf = new char[len];
while (tokenPos >= 0)
{
if (str[tokenPos] == ' ')
{
//문자복사
buf[writePos] = str[tokenPos];
writePos++;
tokenPos--;
}
else
{
endPos = tokenPos;
while (tokenPos >= 0 && str[tokenPos] != ' ')
tokenPos--;
readPos = tokenPos + 1;
while (readPos <= endPos)
buf[writePos++] = str[readPos++];
}
}
buf[writePos] = '\0';
return buf;
}
string FlipWordNoBuf(string str)
{
int len = str.length();
int startPos = 0;
FlipString(0, len - 1, str);
for (int i = 0; i < len; i++)
{
if (str[i] == ' ')
{
FlipString(startPos, i - 1, str);
startPos = i + 1;
}
}
if (startPos != len - 1)
FlipString(startPos, len - 1, str);
return str;
}
string FlipString(int start, int end, string& str)
{
auto len = start + end;
auto dif = end - start;
for (int i = start; i <= len / 2; i++)
{
auto tmp = str[i];
str[i] = str[len - i];
str[len - i] = tmp;
}
//cout << str << endl;
return str;
}
int StringToInt(string str)
{
int len = str.length();
int result = 0, temp = 0, start = 0;
bool minus = false;
if (str[0] == '-')
{
minus = true;
start++;
}
for (int i = start; i < len; i++)
{
temp = str[i] - 48;
result *= 10;
result += temp;
}
if (minus)
result *= -1;
return result;
}
string IntToString(int num)
{
int tmp = num;
char* buf = new char[3];
int i = 0;
bool minus = false;
if (num < 0)
{
minus = true;
tmp *= -1;
}
while (tmp != 0)
{
buf[i++] = (char)(tmp % 10 + '0');
tmp /= 10;
}
// 123 -> 12..3 -> 1...2 -> 0...1
string result = "";
int cnt = 0;
if (minus)
result.append("-");
while (i > 0)
{
i--;
result.push_back(buf[i]);
}
return result;
}
문자열 뒤집기, 단어 뒤집기 (임시버퍼, 기존 문자열사용), 특정문자 제거, 반복되지 않는 첫 단어
'C++' 카테고리의 다른 글
C++ 피보나치 수열 여러 구현 방법 (Fibonacci C++ ) (0) | 2020.01.01 |
---|