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

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.dtcms.com/a/287852.html

相关文章:

  • CCF编程能力等级认证GESP—C++8级—20250628
  • 【EMC设计基础--信号环路分析、PCB设计规则】
  • 深入解析文件操作(上)- 二进制文件和文本文件,流的概念,文件的打开和关闭
  • Visual Studio Code(VSCode)中设置中文界面
  • 使用C#对象将WinRiver项目文件进行复杂的XML序列化和反序列化实例详解
  • STM32_Hal库学习ADC
  • XSS的反射型、DOM型、存储型漏洞
  • sqli-labs靶场通关笔记:第32-33关 宽字节注入
  • Go语言中的类型转换与类型推断解析
  • Spring AI硬核攻略:235个模块解析 + 6大场景实战
  • view和pure的区别
  • 智能合约代理与批量调用优化:最小代理与MultiCall的应用
  • Python趣味算法:百钱百鸡问题——双重循环优化与算法效率分析
  • 【Bluedroid】btif_av_sink_execute_service之服务器启用源码流程解析
  • Typecho博客Ajax评论功能实现全攻略
  • 我是怎么设计一个防重复提交机制的(库存出库场景)
  • 【C语言进阶】结构体
  • Windows原生环境配置Claude Code MCP(通过JSON)
  • 简单易懂,快表 详解
  • 有趣的算法题:有时针分针秒针的钟表上,一天之内,时针和分针可重合多少次?分别在什么时刻重合?
  • 【Python】Pandas
  • rustdesk客户端编译
  • QT窗口(7)-QColorDiag
  • 根据ARM手册,分析ARM架构中,原子操作的软硬件实现的底层原理
  • tailscale在ubuntu22.04上使用
  • Unity物理响应函数与触发器
  • LVS详解
  • GitHub 趋势日报 (2025年07月18日)
  • 【图像处理基石】什么是小波变换?
  • CAN总线负载率计算及示例说明