[Java] 5694.検証システムを設計する---キー値を使用して2つの変数間の関係を解決します!!!

検証コードを含む検証システムを設計する必要があります。各検証中に、ユーザーは新しい検証コードを受け取ります。このコードは、currentTimeの数秒後に有効期限が切れます。検証コードが更新されると、currentTimeでtimeToLive秒が延長されます(以前のcurrentTimeとは異なる場合があります)。

AuthenticationManagerクラスを実装してください:

AuthenticationManager(int timeToLive)AuthenticationManagerを構築し、timeToLiveパラメーターを設定します。
generate(string tokenId、int currentTime)tokenIdを指定して、現在の時刻currentTimeで新しい検証コードを生成します。
renew(string tokenId、int currentTime)指定されたtokenIdで検証コードを更新し、currentTimeで期限切れになりません。指定されたtokenIdに対応する確認コードが存在しないか、有効期限が切れている場合は、この操作を無視してください。更新操作は発生しません。
countUnexpiredTokens(int currentTime)指定されたcurrentTimeで有効期限が切れていない検証コードの数を返します。
検証コードが時刻tに期限切れになり、時刻tに別の操作(renewまたはcountUnexpiredTokens操作)が発生した場合、有効期限イベントは他の操作よりも優先されます。

例1:
ここに画像の説明を挿入

入力:
["AuthenticationManager"、 "renew"、 "generate"、 "countUnexpiredTokens"、 "generate"、 "renew"、 "renew"、 "countUnexpiredTokens"]
[[5]、["aaa"、1]、[" aaa "、2]、[6]、[" bbb "、7]、[" aaa "、8]、[" bbb "、10]、[15]]
出力:
[null、null、null、1、null 、null、null、0]

説明:
AuthenticationManager authenticationManager = new AuthenticationManager(5); // AuthenticationManagerを作成し、timeToLive = 5秒に設定します。
authenticationManager.renew( "aaa"、1); //時間1で、検証コードのないtokenIdは "aaa"であり、検証コードは更新されません。
authenticationManager.generate( "aaa"、2); //時間2で、tokenId "aaa"の新しい検証コードが生成されます。
authenticationManager.countUnexpiredTokens(6); //時間6では、tokenIdが「aaa」である検証コードのみが期限切れになっていないため、1が返されます。
authenticationManager.generate( "bbb"、7); //時間7で、tokenId "bbb"を持つ新しい検証コードが生成されます。
authenticationManager.renew( "aaa"、8); // tokenIdが "aaa"である検証コードは時間7で期限切れになり、8> = 7であるため、時間8での更新操作は無視され、検証コードは更新されません。
authenticationManager.renew( "bbb"、10); // tokenIdが "bbb"である検証コードは時間10で期限切れにならないため、更新操作が実行され、トークンは時間15で期限切れになります。
authenticationManager.countUnexpiredTokens(15); // tokenId "bbb"の検証コードは時間15で期限切れになり、tokenId "aaa"の検証コードは時間7で期限切れになります。すべての検証コードが期限切れになっているため、0が返されます。

促す:

1 <= timeToLive <= 108
1 <= currentTime <= 108
1 <= tokenId.length <= 5tokenId
には小文字の英字のみが含まれます。
generate関数へのすべての呼び出しには、一意のtokenId値が含まれます。
すべての関数呼び出しで、currentTimeの値は厳密にインクリメントされます。
すべての関数の呼び出しの総数は2000回を超えません。

代码:
private int timeToLive;
	private HashMap<String,Integer> hashMap=new HashMap<>();
	public AuthenticationManager(int timeToLive) {
    
    
        this.timeToLive=timeToLive;
    }
    
    public void generate(String tokenId, int currentTime) {
    
    
        this.hashMap.put(tokenId,currentTime+this.timeToLive);
    }
    
    public void renew(String tokenId, int currentTime) {
    
    
    	
        if(this.hashMap.containsKey(tokenId)&&this.hashMap.get(tokenId)>currentTime) {
    
    
        	 this.hashMap.put(tokenId,currentTime+this.timeToLive);
        }else {
    
    
        	this.hashMap.remove(tokenId);
        }
    }
    
    public int countUnexpiredTokens(int currentTime) {
    
    
    	int i=0;
		for (Map.Entry<String,Integer> a: this.hashMap.entrySet()) {
    
    
			 if(a.getValue()>currentTime) {
    
    
				 i++;
			 }
		}
    	return i;
    }

おすすめ

転載: blog.csdn.net/qq_44461217/article/details/115040540