2022-3-23 剑指offer day40
题1:
JZ62 孩子们的游戏(圆圈中最后剩下的数)
描述
每年六一儿童节,牛客都会准备一些小礼物和小游戏去看望孤儿院的孩子们。其中,有个游戏是这样的:首先,让 n 个小朋友们围成一个大圈,小朋友们的编号是0~n-1。然后,随机指定一个数 m ,让编号为0的小朋友开始报数。每次喊到 m-1 的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0... m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客礼品,请你试着想下,哪个小朋友会得到这份礼品呢?
数据范围:1 \le n \le 50001≤n≤5000,1 \le m \le 100001≤m≤10000
要求:空间复杂度 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 \1≤n≤1000 ,字符串中出现的字符一定在 ASCII 码内。
进阶:空间复杂度 O(n)\O(n) ,时间复杂度 O(n) \O(n)
进阶:空间复杂度 O(n)\O(n) ,时间复杂度 O(n) \O(n)
后台会用以下方式调用 Insert 和 FirstAppearingOnce 函数
string caseout = "";1.读入测试用例字符串casein2.如果对应语言有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记录次数,队列记录顺序。
浙公网安备 33010602011771号