LeetCode第152场周赛(Java)
这算是我第一次正式参加 LeetCode 的周赛吧。通过两道题。意料之中(通过上次模拟可以看出来)。总的来说,脑袋还是不太灵光。想的有点慢。全球第一名 0:10:19 就全部通过。。。感觉我的智商被狠狠的摁在地上摩擦了。
参考:huntersjm
5175. 构建回文串检测
我第一次提交的直接 TLE。然后就没有然后了。
TLE 代码的思路(可以不看):
- 定义一个 
int型的notParesNum保存字母个数为奇数的字母的数量。 - 每次检测,将 
[left, right]字串取出,统计里面每种字母的个数,如果个数是奇数,那么将notParesNum数量加 1。 - 统计结束后,检查 
notParesNum / 2与k的关系。如果是大于,那么就是false,否则就是true。 
改进一次后的思路:
- 在循环过程中就检查 
notParesNum / 2与k的关系。如果是false,直接continue。 
依然超时了。然后就没时间了,我就没想了。
正确思路:
- 先要进行预处理。定义 
int型二维数组charNum[length + 1][26]。其中length为字符串s的长度。并且charNum[0]不保存数据。 - 每次检测的时候,先检查 
k的值,如果大于等于 25,那么一定可以将子串替换成回文串,因为最多 26 种字母。(不超时的关键点) - 再检测子串的长度的一半是否超过 
k,如果不超过,那么一定可以将子串替换成回文串。(次关键点) - 过滤上面两部分后,就来最后一种情况,计算 
charNum[right]和charNum[left]的差值,统计字母个数为奇数的字母个数notParesNum。- 统计差值的时候要注意 26 个字母中,有一个字母的个数要额外加 1。具体见代码。
 
 - 统计结束后,检查 
notParesNum / 2与k的关系。如果是大于,那么就是false,否则就是true。 
运算符优先级从高到低顺序:+ -,<< >>,< > <= >=,||,=
代码如下:
class Solution {
	public List<Boolean> canMakePaliQueries(String s,
											int[][] queries) {
		// 1、预处理,统计每种字母的个数
		int length = s.length();// 字母个数
		int[][] charNum = new int[length + 1][26];// 保存个数
		char[] arrS = s.toCharArray();
		for (int i = 0; i < length; ++i) {
			int ch = arrS[i] - 'a';
			charNum[i + 1] = Arrays.copyOf(charNum[i], 26);// 其它字母个数相同
			++charNum[i + 1][ch];// 字母arrS[i]个数加 1
		}
		// 2、保存结果
		List<Boolean> ans = new ArrayList<>();
		// 3、检测每个子串是否可以变成回文串
		for (int[] querie : queries) {
			int left = querie[0];
			int right = querie[1];
			int k = querie[2];
			// 26个字母,最多25次就能替换成回文串,或者子串长度的一半不超过k
			if (k >= 25 || (right - left + 1) >> 1 <= k) {
				ans.add(true);// 一定能用不超过k次替换就能变成回文串
				continue;
			}
			// 超过k次的话,就检查非成对字母的个数的一半是否超过k
			int notParesNum = 0;// 非成对字母个数
			int ch = arrS[left] - 'a';// 左边界字母
			// 统计子串中每个字母的个数,如果个数为奇数,notParesNum加1
			for (int i = 0; i < 26; ++i) {
				// 由于是从charNum[1]开始保存数据,故下标要加1
				int num = charNum[right + 1][i] - charNum[left + 1][i];
				if (i == ch) {// i是左边界字母
					++num;// 个数加1,因为上一步计算差值的时候没有加上这一个
				}
				if (0 != (num & 1)) {// 当前字母个数为奇数
					++notParesNum;// 非对称字母个数加1
				}
			}
			// 非对称的字母可以通过改变变成同一字母,故除以2
			if (notParesNum >> 1 > k) {// 替换次数超过k次
				ans.add(false);
			} else {// 替换次数不超过k次
				ans.add(true);
			}
		}
		return ans;// 返回结果
	}
}
提交结果:

5176. 猜字谜
什么题目,一直超时超时。参考了别人的代码,用它的代码提交了 7、8 次,只有一次通过了。。就一句话解释算了。
用 int 型数保存字符串的字母情况,低 26 位,每一位保存对应位的字母是否存在,1 表示存在,0 表示不存在。
运算符优先级从高到低顺序:+ -,<< >>,==,&,|,|=。
代码如下:
class Solution {
    public List<Integer> findNumOfValidWords(	String[] words,
                                                String[] puzzles) {
        int[] codeWords = new int[words.length];// 保存编码后的值
        for (int i = 0; i < words.length; ++i) {
            codeWords[i] = code(words[i]);// 给每个单词编码
        }
        List<Integer> ans = new ArrayList<>();
        for (String puzzle : puzzles) {// 遍历所有谜面
            int codePuzzle = code(puzzle);// 给谜面编码
            int count = 0;// 谜底个数
            for (int value : codeWords) {// 遍历所有单词的编码
                if ((codePuzzle & value) == value) {// 单词中字母全都在谜面中
                    if ((value >> puzzle.charAt(0) - 'a' & 1) == 1) {
                        ++count;// 单词包含谜面首字母,谜底个数加1
                    }
                }
            }
            ans.add(count);// 个数添加到结果中
        }
        return ans;// 返回结果
    }
    // 整数的低26位保存字符串的字母信息,包含字母,对应位置1
    private int code(String str) {// 将字符串编码成整数
        int num = 0;
        int length = str.length();
        for (int i = 0; i < length; ++i) {
            num |= 1 << str.charAt(i) - 'a';
        }
        return num;// 返回编码后的值,低26位,每一位代表一个字母
    }
}
提交结果:

LeetCode第152场周赛(Java)的更多相关文章
- LeetCode 第 152 场周赛
		
一.质数排列(LeetCode-1175) 1.1 题目描述 1.2 解题思路 先统计出1-n中有多少个质数,得到质数个数\(x\),剩下的数\(y = n - x\): 使用排列组合公式得出结果 \ ...
 - LeetCode 第 165 场周赛
		
LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能 ...
 - Leetcode第 217 场周赛(思维量比较大)
		
Leetcode第 217 场周赛 比赛链接:点这里 做完前两题我就知道今天的竞赛我已经结束了 这场比赛思维量还是比较大的. 1673. 找出最具竞争力的子序列 题目 给你一个整数数组 nums 和一 ...
 - LeetCode第151场周赛(Java)
		
这是我第一次写周赛的题目,而且还是虚拟的.从这次起,以后就将所有错过的题目都写到博客来.当然既然是我错的,那代码肯定不是我自己的.我会注明来源.并且我会自己敲一遍.多总结总是没坏处的. 另外比较糟糕的 ...
 - LeetCode第154场周赛(Java)
		
估计要刷很久才能突破三道题了.还是刷的太少.尽管对了前两题,但是我觉得写的不怎么样.还是将所有题目都写一下吧. 5189. "气球" 的最大数量 题目比较简单.就是找出一个字符串中 ...
 - Leetcode 第133场周赛解题报告
		
今天参加了leetcode的周赛,算法比赛,要求速度比较快.有思路就立马启动,不会纠结是否有更好的方法或代码可读性.只要在算法复杂度数量级内,基本上是怎么实现快速就怎么来了. 比赛时先看的第二题,一看 ...
 - LeetCode 第 196 场周赛 (题目:5452-5455,这是参加过最坑的周赛,暴力n^2居然可以过)
		
5452. 判断能否形成等差数列 给你一个数字数组 arr . 如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 . 如果可以重新排列数组形成等差数列,请返回 tru ...
 - Leetcode 第137场周赛解题报告
		
今天的比赛的题目相对来说比较「直白」,不像前几周都是一些特定的算法,如果你没学过不可能想出来. 做了这些周,对leetcode比赛的题目也发现了一些「规律」. 一般前两道题都很「简单」,只要有想法,直 ...
 - LeetCode 第 153 场周赛
		
一.公交站间的距离(LeetCode-5181) 1.1 题目描述 1.2 解题思路 比较简单的一题,顺时针.逆时针两次遍历,就能解决. 1.3 解题代码 class Solution { publi ...
 
随机推荐
- telegraf 学习一 基本安装
			
telegraf 是influxdata 开发的一个插件驱动的服务器代理,可以方便的用来收集以及报告系统的metrics 我使用mac 系统,测试安装使用了brew 安装 下载地址 说明官方也提供了m ...
 - 2-ESP8266 SDK开发基础入门篇--非RTOS版与RTOS版
			
https://www.cnblogs.com/yangfengwu/p/11071580.html 所有的源码 https://gitee.com/yang456/Learn8266SDKDevel ...
 - gulp+apache代理请求处理javascript跨域请求
			
apache设置(参考) 用 apache 的 mod_proxy 模块开启反向代理功能来实现: 1 修改 apache 配置文件 httpd.conf ,去掉以下两行前面 # 号 LoadModul ...
 - Sql注入基本思路
			
Sql注入基本思路 利用mysql自己动手 登录 使用show databases;查看数据库,sql注入主要用到的是information_schema这个库(mysql中大小写不敏感) infor ...
 - python pycharm错误集锦
			
url:http://www.cnblogs.com/hinimix/p/8016859.html 1, this list creation could be rewritten as a list ...
 - 大div套多个小div,怎样设置外div的高度自适应?
			
在最后一个div 后面加上 overflow:hidden;如下: <div style="width:580px; height:auto; margin:0 auto; <d ...
 - postgresql中pg_walfile_name()
			
pg_walfile_name(lsn pg_lsn):将wal位置转换成文件名 pg_lsn数据类型可以用于存储LSN数据,LSN是指向WAL中某个位置的指针.pg_lsn用XLogRecPtr的形 ...
 - 002 vue-resource
			
一:概述 1.说明 https://github.com/pagekit/vue-resource 2.使用方法 Vue.http.get('/someUrl', [config]).then(suc ...
 - React中跨域问题的完美解决方案
			
针对react版本^16.6.0有多种解决方案 方案一:package.json中加上proxy代理配置 在packge.json加入 "proxy": "http:// ...
 - Python3基础 yield StopIteration.value获取函数的返回值
			
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...