• 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("
    ");
        }
        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("
    ");
        }
        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
    ");
            }
            printf("
    "); // blank line
        }
        return 0;
    }
    
  • 相关阅读:
    leetcode-Minimum Path Sum
    第三十二章 自说明代码
    第三十一章 布局与风格
    第三十章 编程工具
    第二十九章 集成
    第二十八章 管理构建
    第二十五章 代码调整策略
    第二十六章 代码调整技术
    第二十七章 程序规模对构建的影响
    第二十四章 重构
  • 原文地址:https://www.cnblogs.com/Emerald/p/4604163.html
Copyright © 2020-2023  润新知