笔试狂刷--Day12(模拟 + 链表的公共节点 + dp)

2024-05-04 15:04

本文主要是介绍笔试狂刷--Day12(模拟 + 链表的公共节点 + dp),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大家好,我是LvZi,今天带来笔试狂刷--Day12(模拟 + 链表的公共节点 + dp)
在这里插入图片描述

一.删除公共字符(哈希)

题目链接:删除公共字符(哈希)
在这里插入图片描述

分析:

分别读取俩个字符串,将第二个字符串存储到set之中,再遍历第一个字符串,删除公共字符

代码:

import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);char[] str1 = in.nextLine().toCharArray();char[] str2 = in.nextLine().toCharArray();Set<Character> set = new HashSet<>();for(char ch : str2) set.add(ch);StringBuffer ret = new StringBuffer();for(int i = 0; i < str1.length; i++)if(!set.contains(str1[i]))ret.append(str1[i] + "");System.out.print(ret.toString());}
}

二.两个链表的第⼀个公共结点

题目链接:两个链表的第⼀个公共结点
在这里插入图片描述

分析:

模拟即可

代码一:

暴力解法(最容易想到的方法,本质是计数)

  • 分别统计出两个链表的长度,求出差值,让两个链表的长度一致
  • 遍历两个链表,直到值相同
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 len1 = 0, len2 = 0;ListNode c1 = pHead1, c2 = pHead2;while(c1 != null) {c1 = c1.next; len1++;}while(c2 != null) {c2 = c2.next; len2++;}c1 = pHead1; c2 = pHead2;int gap = Math.abs(len1 - len2);if(len1 > len2) {while(gap-- > 0) c1 = c1.next;}else {while(gap-- > 0) c2 = c2.next;}while(c1 != null && c1.val != c2.val) {c1 = c1.next; c2 = c2.next;}return c1;}
}

代码二:

利用等量关系:
创建两个指针cur1和cur2,同时往后走,如果走到节点的末尾(null),就让指针指向另一个节点的头结点,继续往后走,直到两个指针所处的节点相同

在这里插入图片描述


代码二:

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;ListNode cur1 = pHead1, cur2 = pHead2;while(cur1 != cur2) {cur1 = cur1 == null ? pHead2 : cur1.next;cur2 = cur2 == null ? pHead1 : cur2.next;}return cur1;}
}

三.mari和shiny(dp)

题目链接:mari和shiny(dp)
在这里插入图片描述

分析:

分别统计s,sh,shy的数量即可
使用cnt1来统计字符s的数量,使用cnt2统计字符sh的数量,使用ret统计shy的数量

代码:

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

总结:

  • 本题不要想复杂了,实际上只需要维护两个字符的数量即可,本质上是一个简单的动态规划的思想

这篇关于笔试狂刷--Day12(模拟 + 链表的公共节点 + dp)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/959480

相关文章

嵌入式软件常见的笔试题(c)

找工作的事情告一段落,现在把一些公司常见的笔试题型整理一下,本人主要是找嵌入式软件方面的工作,笔试的也主要是C语言、数据结构,大体上都比较基础,但是得早作准备,才会占得先机。   1:整型数求反 2:字符串求反,字符串加密,越界问题 3:字符串逆序,两端对调;字符串逆序,指针法 4:递归求n! 5:不用库函数,比较两个字符串的大小 6:求0-3000中含有9和2的全部数之和 7

公共筛选组件(二次封装antd)支持代码提示

如果项目是基于antd组件库为基础搭建,可使用此公共筛选组件 使用到的库 npm i antdnpm i lodash-esnpm i @types/lodash-es -D /components/CommonSearch index.tsx import React from 'react';import { Button, Card, Form } from 'antd'

chart 完成拓扑图单节点拖拽不影响其他节点位置

就是做这种的功能,箭头原本是可以动态重复移动的,但不知道哪里问题导致没箭头了,然后补了个edgeSymbol: ['','arrow'], 字段,才增加了箭头。 拖拽某个节点,只有关联到的线条会跟着变动其他的节点位置不变。 参考 https://gallery.echartsjs.com/editor.html?c=x8Fgri22P9 https://echarts.baidu.com/exa

基于 Java 实现的智能客服聊天工具模拟场景

服务端代码 import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;public class Serv

LeetCode--234 回文链表

题目 请判断一个链表是否为回文链表。 示例 示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val

LeetCode--206 反转链表

题目 反转一个单链表。 示例 示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL class Solution {public:ListNode* reverseList(ListNode* head) {if (head == nullptr || head->next == nullptr){return head;}ListNo

剑指offer(C++)--两个链表的第一个公共结点

题目 输入两个链表,找出它们的第一个公共结点。 解法一 两个链表一定有交点的话,方法是指向短链表指针先走完,然后指向长链表,指向长链表指针后走完,指向短链表。所以,第二次走过,一定会在交点相遇。 class Solution {public:ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) {ListN

(13)DroneCAN 适配器节点(一)

文章目录 前言 1 特点 2 固件  3 ArduPilot固件DroneCAN设置 4 DroneCAN适配器节点 前言 这些节点允许现有的 ArduPilot 支持的外围设备作为 DroneCAN 或 MSP 设备适应 CAN 总线。这也允许扩展自动驾驶仪硬件的功能。如允许 I2C 设备(如罗盘或空速)距离自动驾驶仪 1m 以上,并实现多达 32 个伺服输出通道。

算法6— 判断两个链表是否相交

问题: 给出两个单向链表的头指针,比如h1、h2,判断链表是否相交,如果不相交返回NULL;如果相交,返回指向第一个相交节点的指针。时间复杂度控制在O(n)。 分析: 如果两单向链表相交的话,一定是Y型相交,不可能出现X型,弄清楚这点后接下来的工作就是: (1)先找到h1,h2的最后一个节点L1和L2,同时记录节点数量a,b;(这里假设 a > b) (2)判断最后一个节点是否相同

剑指Offer—编程题56(链表中环的入口地址)

题目:一个链表中包含环,如何找出环的入口结点? 解题思路   可以用两个指针来解决这个问题。先定义两个指针P1和P2指向链表的头结点。如果链表中环有n个结点,指针P1在链表上向前移动n步,然后两个指针以相同的速度向前移动。当第二个指针指向环的入口结点时,第一个指针已经围绕着环走了一圈又回到了入口结点。    剩下的问题就是如何得到环中结点的数目。我们在面试题15的第二个相关题目时用到