Untitled

 avatar
Darin
plain_text
2 years ago
2.6 kB
6
Indexable
Tối ưu đoạn code sau cả về thời gian chạy và syntax sao cho dễ hiểu nhất, ngắn gọn nhất.

import java.util.HashMap;
import java.util.Map;
import java.util.TreeSet;

class UserSolution {
	Map<String, TreeSet<String>> mapDir[] = new HashMap[3];
	Map<String, Room> map = new HashMap<>();
	Room current;

	void init() {
		map.clear();
		for (int i = 0; i < 3; i++) {
			mapDir[i] = new HashMap<>();
		}
	}

	void addRoom(int mID, char[] mWord, int[] mDirLen) {
		Room room = new Room(mID, mWord, mDirLen);
		room.addToHash();
	}

	void setCurrent(char mWord[]) {
		current = map.get(string(mWord));
	}

	// di chuyển current, nếu không được return 0
	int moveDir(int mDir) {
		String keyWord = current.dir[mDir];
		if (mapDir[mDir].get(keyWord) != null) {
			for (String word : mapDir[mDir].get(keyWord)) {
				Room room = map.get(word);
				if (room != current) { // ???
					current = room;
					return room.id;
				}
			}
		}
		return 0;
	}

	void changeWord(char mWord[], char mChgWord[], int mChgLen[]) {
		Room room = map.get(string(mWord));
		room.removeFromHash();
		addRoom(room.id, mChgWord, mChgLen);
		if (room == current) { // ???
			current = map.get(string(mChgWord));
		}
	}

	class Room {
		int id;
		String word;
		String dir[] = new String[3];

		Room(int mID, char[] mWord, int[] mDirlen) {
			id = mID;
			word = string(mWord);
			dir[0] = word.substring(0, mDirlen[0]);
			dir[1] = word.substring(4, 7);
			dir[2] = word.substring(word.length() - mDirlen[2]);
		}

		void addToHash() {
			// thêm Room vào map với từ khóa word
			// đảo ngược
			map.put(word, this);
			// back
			mapDir[2].computeIfAbsent(word.substring(0, 2),
					k -> new TreeSet<>()).add(word);
			mapDir[2].computeIfAbsent(word.substring(0, 4),
					k -> new TreeSet<>()).add(word);
			// middle
			mapDir[1].computeIfAbsent(word.substring(4, 7),
					k -> new TreeSet<>()).add(word);
			// front
			mapDir[0].computeIfAbsent(word.substring(7), k -> new TreeSet<>())
					.add(word);
			mapDir[0].computeIfAbsent(word.substring(9), k -> new TreeSet<>())
					.add(word);
		}

		void removeFromHash() {
			map.remove(word);
			mapDir[2].get(word.substring(0, 2)).remove(word);
			mapDir[2].get(word.substring(0, 4)).remove(word);
			mapDir[1].get(word.substring(4, 7)).remove(word);
			mapDir[0].get(word.substring(7)).remove(word);
			mapDir[0].get(word.substring(9)).remove(word);
		}
	}

	String string(char[] s) {
		return new String(s).trim();
	}
}
Editor is loading...