大致题意:用{ key:value, key:value, key:value }的形式表示一个字典key表示建,在一个字典内没有重复,value则可能重复 题目输入两个字典,如{a:3,b:4,c:10,f:16} {a:3,c:5,d:10,ee:4}
于新字典相比,找出旧字典的不同,并且输出用相应格式,增加的用‘+‘,如 +d,ee
减少的用‘-‘,如 -b,f
value变化的用*,如 *c
没有不同则输出"No changes""
如果使用java,则可以用TreeMap对新旧字典做映射,然后对两个TreeMap对象做比较,同时注意一些小细节:
import java.util.*; public class Main{ public static void main( String []args ) { Scanner in = new Scanner( System.in ); int T = Integer.parseInt( in.nextLine() ); while( T!=0 ) { T --; String oldStr = in.nextLine(); TreeMap<String, String> oldMap = new TreeMap<>(); str2Map(oldStr, oldMap); String newStr = in.nextLine(); TreeMap<String, String> newMap = new TreeMap<>(); str2Map(newStr, newMap); // 三个函数都要执行 boolean isChanged = addOrDel(newMap, oldMap, ‘+‘); // 新字典中增加 isChanged = addOrDel(oldMap, newMap, ‘-‘) || isChanged; // 旧字典中减少 isChanged = isUpdate( newMap, oldMap, ‘*‘ ) || isChanged; // 更改过的 if( !isChanged ) { System.out.println("No changes"); } System.out.println(); } } public static void str2Map( String str, TreeMap<String, String> map ) { StringBuffer strbuffer = new StringBuffer(str); for( int i=0; i<strbuffer.length(); i ++ ) { if( !Character.isLetterOrDigit( strbuffer.charAt(i) ) ) { // 将‘{‘,‘}‘,‘:‘,‘,‘修改为空格 strbuffer.setCharAt(i, ‘ ‘); } } // 以空格为分割符进行分割 StringTokenizer st = new StringTokenizer( new String(strbuffer), " "); while( st.hasMoreTokens() ) { map.put( st.nextToken() , st.nextToken() ); } } public static boolean addOrDel( TreeMap<String, String> oldMap, TreeMap<String, String> newMap, char op ) { boolean isChanged = false; for( java.util.Map.Entry<String, String> entry : oldMap.entrySet()){ String strkey = entry.getKey(); // 只有其中一个字典有,而另一个字典没有 if( !newMap.containsKey(strkey) ) { if( !isChanged ) { System.out.print( op+strkey ); isChanged = true; } else { System.out.print( ","+strkey ); } } } if( isChanged ) { System.out.println(); } return isChanged; } public static boolean isUpdate( TreeMap<String, String> oldMap, TreeMap<String, String> newMap, char op ) { boolean isChanged = false; for( java.util.Map.Entry<String, String> entry : oldMap.entrySet() ) { String strkey = entry.getKey(); // 新旧字典都有,但value不等 if( newMap.containsKey(strkey) && !newMap.get(strkey).equals( oldMap.get(strkey) ) ) { if( !isChanged ) { System.out.print( op + strkey ); isChanged = true; } else { System.out.print( "," + strkey ); } } } if( isChanged ) { System.out.println(); } return isChanged; } }
如果是C++,也是类似的,用map做映射,也是注意一些细节即可
/* UvaOJ 12504 Emerald Sat 27 Jun 2015 */ #include <iostream> #include <cstring> #include <cstdio> #include <cctype> #include <map> #include <sstream> #include <string> using namespace std; string Standard( string str ) { for( int i=0; i<str.length(); i++ ) { if( !isalpha( str[i] ) && !isdigit( str[i] ) ) { str[i] = ‘ ‘; } } return str; } void WriteMap( string& dict, std::map<string, string>& m ) { dict = Standard( dict ); stringstream ss( dict ); string tmp, tmp2; while( ss >> tmp ) { ss >> tmp2; m[ tmp ] = tmp2; } } bool CompareDict( std::map<string, string>& oldMap, std::map<string, string>& newMap, char op ) { std::map<string, string>::iterator it; bool isChanged = false; for( it=newMap.begin(); it!=newMap.end(); it ++ ) { if( !oldMap.count( it->first ) ) { if( !isChanged ) { printf("%c%s", op, it->first.c_str() ); isChanged = true; } else { printf(",%s", it->first.c_str()); } } } if( isChanged ) { printf("\n"); } return isChanged; } bool Update( std::map<string, string>& oldMap, std::map<string, string>& newMap ) { bool isChanged = false; std::map<string, string>::iterator it; for( it=oldMap.begin(); it!=oldMap.end(); it ++ ) { if( newMap.count( it->first ) && newMap[it->first]!=oldMap[it->first] ) { // defferent items if( !isChanged ) { printf("*%s", it->first.c_str() ); isChanged = true; } else { printf(",%s", it->first.c_str()); } } } if( isChanged ) { printf("\n"); } return isChanged; } int main() { int T; cin >> T; cin.get(); while( T -- ) { std::map<string, string> oldMap, newMap; string oldDict; getline( cin, oldDict ); WriteMap( oldDict, oldMap ); string newDict; getline( cin, newDict ); WriteMap( newDict, newMap ); bool isChanged = CompareDict( oldMap, newMap, ‘+‘ ); // new add isChanged = CompareDict( newMap, oldMap, ‘-‘ ) || isChanged ; // old del isChanged = Update( oldMap, newMap ) || isChanged; if( !isChanged ) { printf("No changes\n"); } printf("\n"); // blank line } return 0; }
时间: 2024-11-06 07:34:28