2022-3-23 剑指offer day40

题1:

JZ62 孩子们的游戏(圆圈中最后剩下的数)

描述

    每年六一儿童节,牛客都会准备一些小礼物和小游戏去看望孤儿院的孩子们。其中,有个游戏是这样的:首先,让 n 个小朋友们围成一个大圈,小朋友们的编号是0~n-1。然后,随机指定一个数 m ,让编号为0的小朋友开始报数。每次喊到 m-1 的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0... m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客礼品,请你试着想下,哪个小朋友会得到这份礼品呢?
数据范围:1 \le n \le 50001n5000,1 \le m \le 100001m10000
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
 1 public class Solution {
 2     public int LastRemaining_Solution(int n, int m) {
 3         boolean[] f=new boolean[n];
 4         int point=0;
 5         for (int i=0;i<n-1;i++) {
 6             int count=1;
 7             while (count<m) {
 8                 if (!f[point]){
 9                     count++;
10                     point++;
11                 }else {
12                     point++;
13                 }
14                 point%=n;
15             }
16             if (f[point])
17             f[point]=true;
18         }
19         int res=0;
20         for (int i=0;i<n;i++){
21             if (!f[i]) res=i;
22         }
23         return res;
24     }
25 }

思路:约瑟夫问题。模拟。

 

题2:

JZ75 字符流中第一个不重复的字符

 

描述

请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符 "go" 时,第一个只出现一次的字符是 "g" 。当从该字符流中读出前六个字符 “google" 时,第一个只出现一次的字符是"l"。
 
数据范围:字符串长度满足 1 \le n \le 1000 \1n1000  ,字符串中出现的字符一定在 ASCII 码内。
进阶:空间复杂度 O(n)\O(n)  ,时间复杂度 O(n) \O(n) 
 
后台会用以下方式调用 Insert 和 FirstAppearingOnce 函数
string caseout = "";
1.读入测试用例字符串casein
2.如果对应语言有Init()函数的话,执行Init() 函数
3.循环遍历字符串里的每一个字符ch {
Insert(ch);
caseout += FirstAppearingOnce()
}
2. 输出caseout,进行比较。

返回值描述:

如果当前字符流没有存在出现一次的字符,返回#字符。
 1 import java.util.*;
 2 public class Solution {
 3     Map<Character,Integer> map=new HashMap<>();;
 4     Queue<Character> q=new LinkedList<>();
 5     //Insert one char from stringstream
 6     public void Insert(char ch)
 7     {
 8         if (!map.containsKey(ch)) q.offer(ch);
 9         map.put(ch,map.getOrDefault(ch,0)+1);
10     }
11   //return the first appearence once char in current stringstream
12     public char FirstAppearingOnce()
13     {
14         while (!q.isEmpty()) {
15             char c=q.peek();
16             if (map.getOrDefault(c,0)>1){
17                 q.poll();
18             }else return c;
19         }
20         return '#';
21         
22     }
23 }

思路:hashmap记录次数,队列记录顺序。

posted on 2022-03-23 14:11  阿ming  阅读(26)  评论(0)    收藏  举报

导航