(一)开发环境
Windows 10 Visual Studio 2017
(二)题目相关
1.题目
本题中,字典是若干键值对,其中键为小写字母组的字符串,值为没有前导零或正号的非负整数(-4,03,+77都是非法的,注意该整数可以很大)。输入一个旧字典和一个新字典,计算二者的变化。输入的两个字典中键都是唯一的,但是排列顺序任意。其格式为(注意字典格式中不包含任何空白符): {key:value,key:value,···,key:value} 输入包含两行,各包含不超过100个字符,即旧字典和新字典。输出格式如下: 1. 如果包含至少有一个新增键,打印一个“+”号,然后是所有新增键,按字典顺序从小到大排列。 2. 如果包含至少有一个删除键,打印一个“-”号,然后是所有删除键,按字典顺序从小到大排列。 3. 如果包含至少有一个修改键,打印一个“*”号,然后是所有修改键,按字典顺序从小到大排列。 例如,若输入两行分别为{a:3,b:4,c:10,f:6}和{a:3,c:,d:10,ee:4},则输出为:+d,ee;-b,f;*c
2.题目大意
键和值对应,首先想到map 获得的数据不能直接使用需要处理 map有自动排序,所以直接输出数据即可 ps.unordered_map是无排序功能的
3.数据分析
已知数据的格式为 {key:value,key:value,···,key:value} 为了得到更明显的特征可以暂时忽略 { 和 } 得到新的格式为 key:value,key:value,···,key:value 若在最后的键值后补一个 , key:value,key:value,···,key:value, 很容易发现 key 的后面是 : value 的后面是 , 保存这些值并添加到map中即可
(三)代码相关
dictionary.h
#pragma once
#include <map>
#include <string>
#include <iostream>
class dictionary {
public :
typedef std:: map< std:: string, std:: string> ssMap;
enum state {
DEFAULT,
KEY, VAL, ENDVAL
} ;
public :
dictionary ( std:: string & dicData) ;
~ dictionary ( ) ;
void init ( std:: string & dicData) ;
void updating ( std:: string & dicData) ;
void showDictionary ( ) ;
private :
ssMap dic;
ssMap updataDic, deleteDic, modifyDic;
} ;
dictionary.cpp
#include "dictionary.h"
dictionary:: dictionary ( std:: string & dicData) {
init ( dicData) ;
}
dictionary:: ~ dictionary ( ) {
}
void dictionary:: init ( std:: string & dicData) {
dic. clear ( ) ;
updataDic. clear ( ) ;
deleteDic. clear ( ) ;
modifyDic. clear ( ) ;
std:: string dicKey, dicVal;
state handleState = DEFAULT;
for ( auto & i : dicData) {
if ( i == '{' ) {
handleState = KEY;
continue ;
}
else {
if ( handleState == ENDVAL) {
break ;
}
else {
if ( i == '}' ) {
i = ',' ;
handleState = ENDVAL;
}
}
switch ( handleState) {
case KEY:
if ( i == ':' ) {
handleState = VAL;
}
else if {
dicKey + = i;
}
break ;
case ENDVAL:
case VAL:
if ( i == ',' ) {
dic[ dicKey] = dicVal;
dicKey. clear ( ) ;
dicVal. clear ( ) ;
handleState = KEY;
}
else {
dicVal + = i;
}
break ;
default :
break ;
}
}
}
}
void dictionary:: updating ( std:: string & dicData) {
updataDic. clear ( ) ;
deleteDic. clear ( ) ;
modifyDic. clear ( ) ;
ssMap newDic;
std:: string dicKey, dicVal;
state handleState = DEFAULT;
for ( auto & i : dicData) {
if ( i == '{' ) {
handleState = KEY;
continue ;
}
else {
if ( handleState == ENDVAL) {
break ;
}
else {
if ( i == '}' ) {
i = ',' ;
handleState = ENDVAL;
}
}
switch ( handleState) {
case KEY:
if ( i == ':' ) {
handleState = VAL;
}
else {
dicKey + = i;
}
break ;
case ENDVAL:
case VAL:
if ( i == ',' ) {
newDic[ dicKey] = dicVal;
auto state = dic. find ( dicKey) ;
if ( state == dic. end ( ) ) {
updataDic[ dicKey] = dicVal;
}
else if ( dic[ dicKey] != dicVal) {
modifyDic[ dicKey] = state- > second;
dic. erase ( state) ;
}
dicKey. clear ( ) ;
dicVal. clear ( ) ;
handleState = KEY;
}
else {
dicVal + = i;
}
break ;
default :
break ;
}
}
}
for ( auto & i : dic) {
auto state = newDic. find ( i. first) ;
if ( state == newDic. end ( ) ) {
deleteDic[ i. first] = i. second;
}
}
dic. swap ( newDic) ;
}
void dictionary:: showDictionary ( ) {
bool first = true ;
for ( auto & i : updataDic) {
if ( first) {
std:: cout << '+' ;
}
else {
std:: cout << ',' ;
}
std:: cout << i. first;
first = false ;
}
std:: cout << ';' ;
first = true ;
for ( auto & i : deleteDic) {
if ( first) {
std:: cout << '-' ;
}
else {
std:: cout << ',' ;
}
std:: cout << i. first;
first = false ;
}
std:: cout << ';' ;
first = true ;
for ( auto & i : modifyDic) {
if ( first) {
std:: cout << '*' ;
}
else {
std:: cout << ',' ;
}
std:: cout << i. first;
first = false ;
}
std:: cout << std:: endl;
}
main.cpp
#include <iostream>
#include <cstdlib>
#include <string>
#include "dictionary.h"
int main ( ) {
std:: string data = "{a:3,b:4,c:10,f:6}" ;
dictionary dic ( data) ;
data = "{a:3,c:,d:10,ee:4}" ;
dic. updating ( data) ;
dic. showDictionary ( ) ;
system ( "PAUSE" ) ;
return 0 ;
}