当前位置:   article > 正文

Day57_给定一个字符串 (s) 和一个禁用单词列表 (banned)。返回出现次数最多,同时不在禁

给定一个字符串 (s) 和一个禁用单词列表 (banned)。返回出现次数最多,同时不在禁

819、最常见的单词

给定一个段落 (paragraph) 和一个禁用单词列表 (banned)。返回出现次数最多,同时不在禁用列表中的单词。题目保证至少有一个词不在禁用列表中,而且答案唯一。禁用列表中的单词用小写字母表示,不含标点符号。段落中的单词不区分大小写。答案都是小写字母。

 使用正则表达式来把除小写字母的字符替换

  1. class Solution {
  2. public String mostCommonWord(String paragraph, String[] banned) {
  3. paragraph = paragraph.toLowerCase();//段落中的单词不区分大小写。答案都是小写字母。
  4. //只有replaceAll才能用正则表达式
  5. paragraph = paragraph.replaceAll("[^a-z]", " ");//将除了小字字母的字符全部替换成空格
  6. //因为考虑到禁用单词不是答案,所以也替换成空格
  7. for (String temp : banned) {
  8. paragraph = paragraph.replaceAll(temp, " ");
  9. }
  10. int times = -1;//判断每一个单词出现的次数
  11. String[] s = paragraph.split(" ");
  12. Map<String, Integer> map = new HashMap<>();
  13. for (String ans : s) {
  14. if (ans.length() > 0) {//防止split里有空字符串传入数组里
  15. if (map.containsKey(ans)) {
  16. map.put(ans, map.get(ans) + 1);
  17. } else {
  18. map.put(ans, 1);
  19. }
  20. } else {
  21. continue;
  22. }
  23. }
  24. /*这些注释里的两个循环的功能等同于下面的一个循环的功能
  25. for(Map.Entry<String,Integer>entry:map.entrySet()){
  26. times=Math.max(times,entry.getValue());//记录单词出现次数最多的
  27. }
  28. for(Map.Entry<String,Integer>entry:map.entrySet()){
  29. if(times== entry.getValue()){
  30. return entry.getKey();
  31. }
  32. }
  33. */
  34. String ans="";
  35. for(Map.Entry<String, Integer> entry : map.entrySet()) {
  36. if(entry.getValue() > times) {
  37. times = entry.getValue();
  38. ans = entry.getKey();
  39. }
  40. }
  41. return ans;
  42. }
  43. }

859、亲密字符串

给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。

暴力解法(s的字符进行两两交换)——超时 

注意一个知识点:

char[]c=s.toCharArray();

new String(c) 可以让c变成s字符串

c.toString() 把c变成s字符串的地址

所以应该用new String(c).equals(goal)来判断 数组转成字符串与goal 判断字符串是否相同

  1. class Solution {
  2. public boolean buddyStrings(String s, String goal) {
  3. for(int i=0;i<s.length();i++){
  4. for(int j=i+1;j<s.length();j++){
  5. if(swap(s,i,j,goal)){
  6. return true;
  7. }else{
  8. continue;
  9. }
  10. }
  11. }
  12. return false;
  13. }
  14. public boolean swap(String s,int start,int end, String goal){
  15. String ans=s;
  16. // System.out.println(ans);
  17. char[]c=ans.toCharArray();
  18. char temp=c[start];
  19. c[start]=c[end];
  20. c[end]=temp;
  21. // System.out.println(new String(c));
  22. if(new String(c).equals(goal)){
  23. return true;
  24. }else{
  25. return false;
  26. }
  27. }
  28. }

亲密字符(2,3的判断是亲密字符)
1.当s 与goal长度或词频数不同,必然不为亲密字符;
2.当「s 与goal位置不同的字母个数为2」——eg:"abab"  "abba"   ab和ba的相对位置是不同的,这样的字母有2个。
3.当「s 与goal 位置不同的字符数量为0,但同时s中有出现至少一次单个字符数量≥2的字符」——eg:"ab" "ab"这样子不是亲密字符   "abc"  "abc"这样是亲密字符  "aa" "aa" 这样是亲密字符

针对但同时s中有出现至少一次单个字符数量≥2的字符解释举例说明:"abcd" "abcd"显然不是亲密字符     "abca" "abca" 是亲密字符

  1. class Solution {
  2. public boolean buddyStrings(String s, String goal) {
  3. //亲密字符说明(1):若s和goal的长度不相等直接返回false
  4. if (s.length() != goal.length()) return false;
  5. //初始化两个数组 用来存放s 和 goal的字母
  6. int a[] = new int[26], b[] = new int[26];
  7. int x, y, sum = 0;
  8. for (int i = 0; i < s.length(); i++) {
  9. x = s.charAt(i) - 'a';
  10. y = goal.charAt(i) - 'a';
  11. a[x]++;//对每一个字母计数
  12. b[y]++;
  13. if (x != y) sum++;//亲密字符说明(2):记录位置不同的字母个数
  14. }
  15. boolean flag = false;
  16. for (int i = 0; i < 26; i++) {
  17. if (a[i] != b[i]) return false;//亲密字符说明(1):判断s和goal的其中每个字母的数量是否一样 若不一样直接返回false
  18. if (a[i] > 1) flag = true;//亲密字符说明(3)若有字母数量超过1则把flag置为true
  19. }
  20. //能走到这一步说明s和goal的长度相同,字母相同
  21. //只有两种能返回true:
  22. // 第一种:s和goal有两个位置不同的
  23. // 第二种:没有位置不同的但是需要有字母的数量大于1 例如:"ab" "ab" return false "abb" "abb" returen true
  24. return sum == 2 || (sum == 0 && flag == true);
  25. }
  26. }

2043、简易银行系统

注意题目的红色和蓝色标注

因为账户有1~n个,所以1≤account≤balance.length。因为是使用数组,所以accoun=1存放在balance[0]去 ,account=balance.length存放在balance[balance.length-1]里

  1. class Bank {
  2. long[]balance;
  3. //账户有1~n个,因为是使用数组,所以accoun=1存放在balance[0]去
  4. boolean check(int account) { //检查账户是否在1~n之间
  5. return account>=1&&account<=balance.length;
  6. }
  7. public Bank(long[] balance) {//构造器
  8. this.balance=balance;
  9. }
  10. public boolean transfer(int account1, int account2, long money) {
  11. if(check(account1)&&check(account2)){
  12. if(balance[account1-1]>=money){
  13. balance[account1-1]-=money;
  14. balance[account2-1]+=money;
  15. return true;
  16. }else{
  17. return false;
  18. }
  19. }else{
  20. return false;
  21. }
  22. }
  23. public boolean deposit(int account, long money) {
  24. if(check(account)){
  25. balance[account-1]+=money;
  26. return true;
  27. }else{
  28. return false;
  29. }
  30. }
  31. public boolean withdraw(int account, long money) {
  32. if(check(account)&&balance[account-1]>=money){
  33. balance[account-1]-=money;
  34. return true;
  35. }else{
  36. return false;
  37. }
  38. }
  39. }
  40. /**
  41. * Your Bank object will be instantiated and called as such:
  42. * Bank obj = new Bank(balance);
  43. * boolean param_1 = obj.transfer(account1,account2,money);
  44. * boolean param_2 = obj.deposit(account,money);
  45. * boolean param_3 = obj.withdraw(account,money);
  46. */

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/527264
推荐阅读
相关标签
  

闽ICP备14008679号