Uva 511 Updating a Dictionary

大致题意:用{ 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;
}

 

posted @ 2015-06-27 15:45  Emerald  阅读(366)  评论(0编辑  收藏  举报