Leetcode(Random-2)
Leetcode(Random-2)
leetcode随机写5道题而已 没有别的意思
1093. 大样本统计
// 代码是错的 ,但是不知道哪里出错了 只通过了一半的用例
class Solution {
public double[] sampleStats(int[] count) {
// myidea :
/**
最小值:用min记录,遍历count数组,第一次的访问下标所对应的元素不为0的下标就是最小元素
最大值:用max记录,不断更新即可
平均值:用sum记录出现的数字的总和以及数字出现的次数num,然后结果就是sum/num
中位数:记录数字出现的总次数,也就是上述的num。然后判断num是odd or even 然后遍历count找到中位数
众数:用一个map记录数字出现,以及出现的次数,最后遍历这个map找到众数即可
*/
// 定义结果数组
double[] res = new double[5];
Map<Integer,Integer> map = new HashMap<>();
int num = 0;
int sum = 0;
int min = 257;
int max = -1;
double avg = 0.0;
double mid = 0;
int zhong = 0;
//对count数组进行遍历
for(int i = 0;i<count.length;i++){
// 如果下标i所对应的元素值不为0
if(count[i] != 0.0){
// 更新min和,max
min = Math.min(i,min);
max = Math.max(i,max);
// 更新map
map.put(i,count[i]);
// 更新sum
sum+=i*count[i];
// 更新num
num+=count[i];
}
}
System.out.println(num);
avg = (double)sum / (double)num;
// 计算中位数
// 如果有奇数个元素
if(num%2==1){
int half = num/2+1;
for(int key : map.keySet()){
if(half-map.get(key) <= 0){
mid = (double)key;
break;
}
half-=map.get(key);
}
}else{
//有偶数个元素
int half = num/2;
double temp = 0;
boolean flag = true;
for(int key:map.keySet()){
if(half-map.get(key)<=0 && flag){
temp+=(double)key;
flag = false;
}
if(half+1-map.get(key)<=0){
temp+=(double)key;
mid = temp/2.0;
break;
}
half-=map.get(key);
}
}
// 找众数
int maxEleNum = -1;
for(int key:map.keySet()){
if(map.get(key) > maxEleNum){
zhong = key;
maxEleNum = map.get(key);
}
}
res[0] = (double)min;
res[1] = (double)max;
res[2] = avg;
res[3] = mid;
res[4] = zhong;
for(double ele:res) System.out.print(ele+" ");
return res;
}
}
319. 灯泡开关
题目:初始时有 n 个灯泡关闭。 第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭)。第 i 轮,每 i 个灯泡切换一次开关。 对于第 n 轮,你只切换最后一个灯泡的开关。 找出 n 轮后有多少个亮着的灯泡。
class Solution {
public int bulbSwitch(int n) {
// 找到完全平方数的个数就可以了
if(n==1) return 1;
int result = 1;
while(true) {
if(result*result>n)
break;
result++;
}
return result-1;
}
}
984. 不含 AAA 或 BBB 的字符串
class Solution {
public String strWithout3a3b(int A, int B) {
StringBuilder sb = new StringBuilder();
int index = 0;
if(A >= B) index = 2; // index = 2 表示此时要压入 StringBuilder 的是 "a"
if(A < B) index = 1; // index = 1 则表示需要压入的是 "b"
while(A > 0 && B > 0) {
if(index == 2) {
sb.append("a");A--;
if(A >= B) {
sb.append("a");A--;
}
index = 1;
}
else {
sb.append("b");B--;
if(B >= A) {
sb.append("b");B--;
}
index = 2;
}
}
/* 处理多余的A或B */
while(A > 0) {
sb.append("a");A--;
}
while(B > 0) {
sb.append("b");B--;
}
return sb.toString();
}
}
438. 找到字符串中所有字母异位词
定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。
class Solution {
public List<Integer> findAnagrams(String s, String p) {
// myidea 对字符串s进行遍历,i指针指向s中的元素,i从0到sl-pl,每次判断[i,i+pl]区间中的元素是否与p相等即可
int sl = s.length();
int pl = p.length();
// 结果
List<Integer> res = new LinkedList<>();
for(int i = 0;i<sl-pl+1;i++){
// 用一个数组记录p中的所有的元素以及元素的个数,其中数组下标代表小写字母对应的ascii码值减去a的ascii码值
int[] record = new int[26];
for(Character c:p.toCharArray()) record[(int) c- 'a']++;
// 比较[i,i+pl]区间内的元素是否与p的相同
for(int j = i;j<i+pl;j++) record[(int)s.charAt(j) - 'a']--;
// 如果结束比较之后,整个record元素全部都是0的话,说明元素相等
if(isAllZero(record)) res.add(i);
}
return res;
}
// 判断一个数组是否全部为0
public boolean isAllZero(int[] nums){
for(int num:nums) if(num!=0) return false;
return true;
}
}
1268. 搜索推荐系统
给你一个产品数组 products 和一个字符串 searchWord ,products 数组中每个产品都是一个字符串。
请你设计一个推荐系统,在依次输入单词 searchWord 的每一个字母后,推荐 products 数组中前缀与 searchWord 相同的最多三个产品。如果前缀相同的可推荐产品超过三个,请按字典序返回最小的三个。
你以二维列表的形式,返回在输入 searchWord 每个字母后相应的推荐产品的列表。
class Solution {
public List<List<String>> suggestedProducts(String[] products, String searchWord) {
List<List<String>> res = new ArrayList<List<String>>();
for(int i = 0;i<searchWord.length();i++) res.add(new ArrayList<String>());
// 将products数组按照字典序进行排序
Arrays.sort(products);
for(int i = 0;i<searchWord.length();i++){
// 构建searchWord的子字符串
String temp = "";
for(int j = 0;j<=i;j++) temp+=searchWord.charAt(j);
int tl = temp.length();
// 循环遍历已经字典序排序的字符串数组
for(int k = 0;k<products.length;k++){
// 比较product中的元素的前缀是否与temp相同,若相同则加到结果集中
if(products[k].length() >= tl && products[k].substring(0,tl).equals(temp)){
res.get(i).add(products[k]);
// 如果结果集中的数据已经有了3个,就直接跳出循环,不再进行遍历
if(res.get(i).size() ==3) break;
}
}
}
return res;
}
}
Saying Less Doing More