LeetCode 第170周赛

T1:1309. 解码字母到整数映射

解题思路:题目上重点内容就是 字符(’a’ – ‘i’)分别用(’1’ – ‘9’)表示。字符(’j’ – ‘z’)分别用(’10#’ – ’26#’)表示。重点需要关注题目描述的‘#’号处于后面,所以我们可以直接从后往前遍历,当遇到‘#’时,往前取两位即可。最后就是拼接字符串了。
代码:

class Solution {
    public String freqAlphabets(String s) {
        StringBuilder ans = new StringBuilder();
		for (int i = s.length()-1; i >= 0; i--) {
			if (s.charAt(i)!='#'){
				ans.append((char)('a'+s.charAt(i)-'0'-1));
			}else {
				int tmp = ((int)s.charAt(i-2)-'0')*10+(int)(s.charAt(i-1)-'0');
				char c = (char)(tmp+'a'-1);
				ans.append(c);
				i--;
				i--;
			}
		}
		return ans.reverse().toString();
    }
}

T2:1310. 子数组异或查询

解题思路:题目给的意思就是区间异或,比方说给出0,3那就是将数组中第0个第3个进行异或操作。这里我是直接用的遍历(ps:结束后蛮多人说最后一个用例会超时┓( ´∀` )┏ 然而周赛中过了。如果超时的话,可以用前缀和的思想,直接做个预处理。)
代码:

class Solution {
    public int[] xorQueries(int[] arr, int[][] queries) {
        int[] ans = new int[queries.length];
		for (int i = 0; i < queries.length; i++) {
			int t = arr[queries[i][0]];
			for (int j = queries[i][0]+1; j <= queries[i][1]; j++) {
				t^=arr[j];
			}
			ans[i]=t;
		}
		return ans;
    }
}

T3:1311. 获取你好友已观看的视频

解题思路:题目中大概的意思就是,从id为起点,让你找出最短距离为level的好友所观看的视频。也就是说一开始我们不需要管其他人看了哪些视频,只需要找第level层的好友,然后排序他们所看的视频即可。一个典型的BFS题,利用id为起点,用BFS遍历到第level层的好友(id),然后对他们所看的视频进行排序并输出。
代码:

import java.util.Map.Entry;
class Solution {
    public List<String> watchedVideosByFriends(List<List<String>> watchedVideos, int[][] friends, int id, int level) {
        Queue queue = new LinkedList<>();
		queue.offer(id);
		int t = 0;
		boolean[] vised = new boolean[friends.length];
		while (level > t){
			t++;
			int size = queue.size();
			while (size>0){
				size--;
				Integer pop = queue.poll();
				vised[pop] = true;
				for (int i = 0; i < friends[pop].length; i++) {
					if (!vised[friends[pop][i]]){
						vised[friends[pop][i]] = true;
						queue.offer(friends[pop][i]);
					}
				}
			}
		}
		Map<String,Integer> treeMap = new TreeMap<>();
		while (!queue.isEmpty()){
			Integer poll = queue.poll();
			List<String> list1 = watchedVideos.get(poll);
			for (int i = 0; i < list1.size(); i++) {
				String s = list1.get(i);
				if (treeMap.containsKey(s)){
					treeMap.put(s,treeMap.get(s)+1);
				}else {
					treeMap.put(s,1);
				}
			}
		}
		List<String> ans = new ArrayList<>();
		List<Entry<String, Integer>> temp = new ArrayList<Entry<String, Integer>>(treeMap.entrySet());
		Collections.sort(temp,new Comparator<Entry<String,Integer>>() {
			public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
				return o1.getValue()-o2.getValue();
			}
		});

		for (Entry<String, Integer> e: temp) {
			ans.add(e.getKey());
		}
		return ans;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值