当前位置: 首页 > ds >正文

48Days-Day03 | 删除公共字符,两个链表的第一个公共结点,mari和shiny

删除公共字符

删除公共字符_牛客题霸_牛客网

算法思路

直接哈希,把第二个字符塞集合里面,遍历第一个,只要在集合里面有的就跳过

代码

import java.util.HashSet;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);String strA = scan.nextLine();String strB = scan.nextLine();HashSet<Character> set = new HashSet<>();for (int i = 0; i < strB.length(); i++) {if (strB.charAt(i) != ' ') set.add(strB.charAt(i));}StringBuffer sb = new StringBuffer();for (int i = 0; i < strA.length(); i++) {if (set.contains(strA.charAt(i))) continue;sb.append(strA.charAt(i));}System.out.println(sb);}
}

两个链表的第一个公共节点

两个链表的第一个公共结点_牛客题霸_牛客网

算法思路

此处我们采用快慢指针法,具体讲述请参考我的博客

面试题思路

代码

import java.util.*;
/*
public class ListNode {int val;ListNode next = null;ListNode(int val) {this.val = val;}
}*/
public class Solution {public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {if (pHead1 == null || pHead2 == null) return null;int size1 = 0, size2 = 0;ListNode cur1 = pHead1, cur2 = pHead2;ListNode fast, slow;while (cur1.next != null) {size1++;cur1 = cur1.next;}while (cur2.next != null) {size2++;cur2 = cur2.next;}int n = Math.abs(size1 - size2);if (size1 > size2) {fast = pHead1;slow = pHead2;} else {fast = pHead2;slow = pHead1;}while (n > 0) {fast = fast.next;n--;}while (fast != null) {if (fast == slow) return fast;fast = fast.next;slow = slow.next;}return null;}
}

Mari和Shiny

mari和shiny

算法思路

此处我们采用的是dp

  1. 我们引入三个状态转移方程s[i], h[i], y[i],分别表示区间[0, i]中有多少个s, sh, shy
  2. 对于s[i],有两种情况,i位置为s时,s[i] = s[i-1] + 1;而不为s时,就应该和前面[0, i-1]区间中的s的数量相同,所以s[i] = s[i-1]
  3. 同理,对于h[i]同样有两种情况,i位置为h时,h[i]实际上由两部分构成,[0, i-1]区间中的s的数量和sh的数量,所以h[i] = s[i-1] + h[i-1],不为h时则和[0, i-1]区间中sh数量相同
  4. 同理,对于y[i]来说,为y时,y[i] = h[i-1] + y[i-1];不为y时,y[i] = y[i-1]

注意点

存储结果的长度应该为long,否则会溢出

代码【动态转移方程版】

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n = scan.nextInt();String str = scan.next();long[] s = new long[n];long[] h = new long[n];long[] y = new long[n];s[0] = str.charAt(0) == 's' ? 1 : 0;for (int i = 1; i < n; i++) {if (str.charAt(i) == 's') s[i] = s[i - 1] + 1;else s[i] = s[i - 1];if (str.charAt(i) == 'h') h[i] = s[i - 1] + h[i - 1];else h[i] = h[i - 1];if (str.charAt(i) == 'y') y[i] = h[i - 1] + y[i - 1];else y[i] = y[i - 1];}System.out.println(y[n - 1]);}
}

代码【空间优化版】

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n = scan.nextInt();String str = scan.next();long s = 0, h = 0, y = 0;for (int i = 0; i < n; i++) {if (str.charAt(i) == 's') s += 1;else if (str.charAt(i) == 'h') h += s;else if (str.charAt(i) == 'y') y += h;}System.out.println(y);}
}

 

http://www.xdnf.cn/news/15927.html

相关文章:

  • uniapp相关地图 API调用
  • servicemesh 学习
  • 实战分享:Web3 前端开发Defi项目
  • [硬件电路-39]:激光光路的光信号处理、模拟电路的电信号处理、数字电路的电信号处理、软件的信号处理,有哪些共通的操作、运算、变换?
  • 06-人机共生:Prompt之外的思考
  • 【RK3576】【Android14】USB开发调试
  • k8s 基本架构
  • 【小沐学GIS】基于Rust绘制三维数字地球Earth(Rust、OpenGL、GIS)
  • 完美解决 Ubuntu 中自定义启动器图标重复的问题(以 MATLAB 为例)
  • bash方式启动模型训练
  • python基础复习
  • 高压电工作业证考试核心考点:电气安全基础篇
  • 响应式单位rpx及搭配使用UI产品工具
  • 风格多样!5 个覆盖全风格的素材网站,创作有新意
  • AUTOSAR进阶图解==>AUTOSAR_SWS_DiagnosticOverIP
  • 创建套接字并bind的详细过程
  • 从 Server.xml 到字节码:Tomcat 内核全景与请求旅程 10 000 字深剖
  • MinIO深度解析:从核心特性到Spring Boot实战集成
  • 数据结构与算法之美:拓扑排序
  • 外观设计模式
  • Uniapp之键盘弹窗
  • win10连接鼠标自动关闭触摸板/win10关闭触摸板(笔记本)
  • 智能合约代理与批量调用优化:最小代理与MultiCall的应用
  • android studio libs.versions.toml 配置
  • 嵌入式硬件中电感的基本原理与实现详解
  • CSS篇——第二章 六十五项关键技能(下篇)
  • Kotlin方差
  • OpenCV 官翻5 - 机器学习
  • 智能制造——解读39页汽车行业数字化工厂解决方案【附全文阅读】
  • 考研408《计算机组成原理》复习笔记,第三章(5)——磁盘存储器