每周刷题第二期

 

个人主页:星纭-CSDN博客

系列文章专栏:刷题

踏上取经路,比抵达灵山更重要!一起努力一起进步!

目录

一.选择题

1. 

 2.

二.编程题

1.添加逗号

 方法一:递归

 方法二:迭代

2.删除公共字符

3.返回倒数第k个节点 

4.链表的回文结构 

5.相交链表 

6.随机链表的复制

7.环形链表


写题写题!!!

一.选择题

1. 

#include<stdio.h>
int main(){
 	unsigned char i = 7;
 	int j = 0;
 	for(;i > 0;i -= 3){
 		++j;
 	}
 	printf("%d\n", j);
 	return 0;
}

 输出结果是什么?

char类型的变量8个比特位,范围是-128-127.无符号char类型的变量也是8个比特位,范围是0-255.

当超过255时就会进入下一次循环,比如255+1就是0,同理当小于0是也是如此0-1就是255.

这道题的循环的限制条件是i>0,所以循环结束的时候i=0,当然也可能无法等于0直接死循环。

j每加1.i就减3.

j = 0123....3 + 8488....88+85173
i = 741254....减了84次32255....0

所以最终结果是173. 

 2.

#include<stdio.h>
#include<stdlib.h>
void main()
{
  int a = -3;
  unsigned int b = 2;
  long c = a + b;
  printf("%ld\n", c);
}

这道题与整形提升和算术转化有关,不了解的读者可以看这篇文章末尾: http://t.csdnimg.cn/PNaR2

a与b相加,a首先会进行算术转化为unsigned int 类型。又因为用c来接受结果,所以最后的类型是long,%ld是以表示数据按十进制有符号长型整数输入或输出。

二.编程题

1.添加逗号

 题目来源:添加逗号__牛客网

 方法一:递归

void print(int n){
	if(n < 1000){
		printf("%d",n);
	}
	else{
	print(n/1000);
	printf(",%03d",n%1000);
	}
}
int main()
{
	int n = 0;
	scanf("%d",&n);
	print(n);
	return 0;
}

这道题用递归的方式很容易,假设在位数为n的数字中添加逗号,我们可以拆解为在位数为n-3的数字中添加逗号加上逗号和最后三个数字。

结束条件就是当小于四位的时候直接打印即可。

这里为了避免0没有被打印的情况需要补0.

 方法二:迭代

#include<stdio.h>
#include<string.h>
int main(){
	char arr[11] = { 0 };
	
	gets(arr);
	int i = 0;
	int len = strlen(arr);
	for(i = 0;i < len;i++)
	{
		printf("%c",arr[i]);
		if((len - i - 1) % 3 == 0 && i != len - 1){
		printf("%c",',');
		}
	}
	return 0;
}

观察添加完逗号的数字,我们会发现每一个逗号后面的数字个数都是3的整数倍,所以在我们循环打印的时候,当还剩3的整数倍的数字时就需要打印一个逗号了。注意这里为了避免最后还多一个逗号条件还要加一个不是最后一个数字。

这道题的解法还有很多,比如我们通过模10除10,得到最后一个存入一个字符数组中,每存三位加一个逗号,最后再反向打印出来。

2.删除公共字符

题目出处:删除公共字符_好未来笔试题_牛客网 

 因为所给的字符串是有空格的,正常情况下scanf是不能接受空格的,其实也行。

char arr[10];
scanf("%[^\n]s",arr);
printf(arr);

回到这道题;

首先我们需要接受两个字符串的输入这里我们采用gets函数。

#include<stdio.h>

int isexit(char ch,char* arr){
	int i = 0; 
	for(i = 0;i < strlen(arr);i++)
	{
		if(ch == arr[i])
		{
		return 1;
		}
	}
	return 0;
}
int main(){
	char arr1[100] = {0};
	char arr2[100] = {0};
	gets(arr1);
	gets(arr2);
	int i = 0;
	for(i = 0;i < strlen(arr1) ;i++)
	{
		if(isexit(arr1[i],arr2) == 1)
		{
		;
		}else{
		
			printf("%c",arr1[i]);
		}
	}

	return 0;
}

再逐个的判断字符串一中的字符是否存在于2中如果存在,就跳过不打印,不在就打印出来即可 

3.返回倒数第k个节点 

题目出处:. - 力扣(LeetCode) 

题目描述:实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。

解题思路:通过题目描述,我们知道这是一个单向不循环链表,所以链表是不能倒着走的。

最简单的方法就是使用双指针,使这两个指针之间的距离隔开k即可。

可以先让fast指针先走k步,如何二者同时走,直到fast遇到链表NULL,此时的slow指向的就是倒数第k个节点。

 代码:

int kthToLast(struct ListNode* head, int k){
	struct ListNode* fast,*slow;
	fast = slow = head;
	int n = k;
	while(n--){
		fast = fast->next;
	}
	while(fast){
		fast = fast->next;
		slow = slow->next;
	}
	return slow->val;
}

 4.链表的回文结构 

题目出处:链表的回文结构_牛客题霸_牛客网 

题目描述:对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

回文结构:从左往右和从右往左都是一样的。比如数字1221。

解题思路:首先找到这个链表的中间节点,如何将中间节点以后的链表翻转。

然后从两边开始依次比较对称的两个节点是否相等直到NULL,即使是偶数个节点也可以使用这样的方式完成,此时的中间节点就是中间两个节点的第二个。

因为在比较过程中,会有一个指针先行到达NULL,就停止比较了。

在上面的方法中,我们使用了我们之前做过的题的方法。

寻找中间节点和翻转链表,不了解的读者可以观看我的上一篇文章。

寻找中间节点:

    struct ListNode* middleNode(struct ListNode* head) {
        struct ListNode* fast, *slow;
        fast = slow = head;
        while (fast && fast->next) {
            fast = fast->next->next;
            slow = slow->next;
        }
        return slow;
    }

翻转链表:

    struct ListNode* reverseList(struct ListNode* head) {
        if (head == NULL || head->next == NULL) {
            return head;
        } else {
            struct ListNode* new_Head = reverseList(head->next);
            head->next->next = head;
            head->next = NULL;
            return new_Head;
        }
  
    }

然后我们就可以依次进行比较对称节点中的值了。 

    bool chkPalindrome(ListNode* A) {
        // write code here
        struct ListNode*mid = middleNode(A);
        struct ListNode*B =  reverseList(mid);
        struct ListNode*cura = A,*curb = B;
        while(cura && curb){
            if(cura->val != curb->val){
                return false;
            }
            cura = cura->next;
            curb = curb->next;
        }
        return true;
    }

 奇数个节点的时候,两个指针同时到底NULL,偶数个时curb会先到,提前停止比较,不会有问题。

5.相交链表 

题目出处:. - 力扣(LeetCode)

题目描述:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

解题思路:我们可以采用两个指针,遍历两个链表,当这两个指针相同的时候,这个节点就相交的节点了,因为这道题说明了不会存在环的情况,就相对简单一点。

关键是:如果这两个指针从头开始,因为距离相交节点的距离不同,可能会出现一个先到一个后到,然后错过的情况,那么如何使这两个指针同时到达这个节点呢?

我们可以让长的那个链表的指针,先走两个链表的节点差距个数。 如图所示:

正如这样两个指针,从相对一样的位置开始,必定同时到达相交节点,我们怎么知道两者到底相差多少个节点呢?首先我们需要知道两个链表的长度。

int LenList(struct ListNode* cur){
	int count = 0;
	while(cur)
	{
		count++;
		cur = cur->next;
	}
	return count;
}

我们专门封装一个函数来完成求链表长度的功能,因为不成环,所以不会死循环。

然后就是让长链表先走:

	int a = LenList(headA);
	int b = LenList(headB);
	//假设法a>b
	struct ListNode* longlist = headA;
	struct ListNode* shortlist = headB;
	if(b > a){
		longlist = headB;
		shortlist = headA;
	} 
	int gap = a > b? a-b:b-a;
	while(gap--){
		longlist = longlist->next;
	}

 假设法也是解决实际问题的一个好方式,这里使用假设法,可以迅速完成代码,并不需要针对情况写if的条件语句了。

然后就是gap了,因为我们不知道具体谁大谁小,这里使用三目操作符,求绝对值,当然也可以使用abs函数来完成这个求绝对值的操作。

最后就是求这个节点了。

	while(shortlist){
		if(shortlist == longlist){
			return shortlist;
		}
		shortlist = shortlist->next;
		longlist = longlist->next;
	}
	return NULL;

6.随机链表的复制

题目出处:. - 力扣(LeetCode)

题目描述:

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 

例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。

返回复制链表的头节点。

用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

  • val:一个表示 Node.val 的整数。
  • random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为  null 。

你的代码  接受原链表的头节点 head 作为传入参数。

这里的意思其实简单来说,就是让你复制出一个与原链表一模一样的链表,这道题的难点,其实只有一个,就是节点的random指针也要相互对应:

解题思路:我们先在原链表中的每一个节点的后面插入一个新的节点,这个新的节点的值与前一个节点相同,然后遍历链表使新节点的random指针指向前一个节点的random指针指向的节点的下一个节点

加粗的这句话,就是解决这道题的关键。

完成了以上操作,然后就将新的节点拿出来,构成一个新的链表,这样就完成了链表的复制。

//创建新节点 
struct Node*BuyNode(int x){
	struct Node* newnode = (struct Node*)malloc(sizeof(struct Node));
	newnode->val = x;
	newnode->next = newnode->random = NULL;
	return newnode; 
}
struct Node* copyRandomList(struct Node* head) {
	struct Node*cur = head;
	while(cur){
		struct Node* newnode = BuyNode(cur->val);
	//尾插 
		newnode->next = cur->next;
		cur->next = newnode;
		cur = cur->next->next;
	}
	//random
	cur = head;
	while(cur){
		if(cur->random == NULL){
			cur->next->random = NULL;
		}else{
		cur->next->random = cur->random->next; 
		}
		cur = cur->next->next;
	}
    struct Node* copyHead = NULL,*copyTail = NULL;
    cur = head;
    while(cur)
    {
        struct Node* copy = cur->next;
        struct Node* next = copy->next;
        if(copyTail==NULL)
        {
            copyHead = copyTail = copy;
        }
        else{
            copyTail->next = copy;
            copyTail = copyTail->next;
        }
        cur->next = next;
        cur = next;
    }
    return copyHead;
}

7.环形链表

题目出处:. - 力扣(LeetCode) 

题目描述:

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

解题思路:使用快慢指针,如果存在环,那么fast指针会比slow先进入环中,此时二者是有距离差的,快指针每次走两步,慢指针每次走一步。速度差是1,两者会不断接近,从而相遇,如果每相遇就不是环状的了。

代码:

bool hasCycle(struct ListNode *head) {
    struct ListNode* fast,*slow;
    fast = slow = head;
    while(fast && fast->next){
		fast = fast->next->next;
		slow = slow->next;
		if(slow == fast){
			return true;
		}
	}
	return false;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/636796.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

后端之路第二站(正片)——SprintBoot之:设置请求接口

这一篇讲怎么简单结合模拟云接口&#xff0c;尝试简单的后端接接口、接受并传数据 一、下载Apifox接口文档软件 目前的企业都是采用前后端分离开发的&#xff0c;在开发阶段前后端需要统一发送请求的接口&#xff0c;前端也需要在等待后端把数据存到数据库之前&#xff0c;自己…

.NET快速实现网页数据抓取

网页数据抓取需求 本文我们以抓取博客园10天推荐排行榜第一页的文章标题、文章简介和文章地址为示例&#xff0c;并把抓取下来的数据保存到对应的txt文本中。 请求地址&#xff1a;https://www.cnblogs.com/aggsite/topdiggs 创建控制台应用 创建名为DotnetSpiderExercise的控…

Sentinel的授权规则详解

文章目录 1、授权规则1.1、基本规则1.2、如何获取origin1.3、给网关添加请求头1.4、配置授权规则 2、自定义异常结果2.1、异常类型2.2、自定义异常处理 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学…

python web自动话(⽂件上传和⽇期控件)

1.⽂件上传操作-input标签⽂件选择 我们有如下的文件上传的联系网站,我们可以定位到选择文件,但是点击选择文件无法定位到 我们可以看到这个选择文件的标签是input 我们直接使用send_keys进行图片上传 """""" import timefrom selenium import w…

D-Insar操作全程记录

前言 本实例ENVI版本5.6 裁剪 使用工具&#xff1a; 第一个界面&#xff1a; 输入基于上述两个文件画的研究区域。参考文件选择标准&#xff1a;area.shp是基于那个图像画的就选哪个。因为哨兵1的坐标不是地理坐标&#xff0c;故基于哨兵1话的shp需要选择参考影像。如果是…

STM32HAL(四)中断与NVIC解析

目录 中断 中断作用与意义 NVIC 中断向量表 基本概念 功能和作用 NVIC工作原理 STM32中断优先级 1. 优先级分组 2. 优先级设置 3. 中断服务程序执行顺序 4. 配置方法 STM32 NVIC的使用 1&#xff0c;设置中断分组 2&#xff0c;设置中断优先级 3&#xff0c;使…

vue使用driver.js引导并自定义样式和按钮

参考网址https://driverjs.com/docs/installation 安装 npm install driver.js 以下是1.3.1版本的基本使用方法 import { driver } from driver.js import driver.js/dist/driver.css mounted() {// 实例化driver对象const driverObj driver({showProgress: true,steps: …

【mysql】【docker】mysql8-互为主从

&#x1f338;&#x1f338; Linux/docker-compose/mysql8 互为主从 优雅部署 &#x1f338;&#x1f338; 记录下两台Linux的mysql需要热备份&#xff0c;互为主从&#xff0c;后期加上keepalived实现高可用切换 参考博客&#xff1a;答 案 &#x1f338; 一、准备文件 这里…

一文了解基于ITIL的运维管理体系框架

本文来自腾讯蓝鲸智云社区用户&#xff1a;CanWay ITIL&#xff08;Information Technology Infrastructure Library&#xff09;是全球最广泛使用的 IT 服务管理方法&#xff0c;旨在帮助组织充分利用其技术基础设施和云服务来实现增长和转型。优化IT运维&#xff0c;作为企业…

k8s node NotReady后会发生什么?

K8s 是一种强大的容器编排和管理平台&#xff0c;能够高效地调度、管理和监控容器化应用程序&#xff1b;其本身使用声明式语义管理着集群内所有资源模型、应用程序、存储、网络等多种资源&#xff0c;Node 本身又属于 K8s 计算资源&#xff0c;上面承载运行着各种类型的应用程…

141.字符串:重复的字符串(力扣)

题目描述 代码解决 class Solution { public:// 计算字符串s的next数组&#xff0c;用于KMP算法void getNext(int *next, const string& s){int j 0; // j是前缀的长度next[0] 0; // 初始化next数组&#xff0c;第一个字符的next值为0for (int i 1; i < s.size(); …

TAS5711带EQ和DRC支持2.1声道的20W立体声8V-26V数字输入开环D类数字功放音频放大器

前言 数字功放很难搞&#xff0c;寄存器很多&#xff0c;要配置正确才有声音&#xff0c;要想声音好&#xff0c;要好好调整。 TAS5711出道很多年了&#xff0c;现在仍然在不少功放、音箱中能看到。 TAS5711特征 音频输入/输出 从 18V 电源向 8Q 负载提供 20W 功率 宽 PVDD…

深度学习之Tensorflow卷积神经网络手势识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 手势识别是计算机视觉和人工智能领域的重要应用之一&#xff0c;具有广泛的应用前景&#xff…

常用生物信息学服务器推荐

1、超强性能&#xff0c;AMD 256核心&#xff0c;512线程&#xff0c;2.5TB满通道内存&#xff0c;200T硬盘 CPU&#xff1a;2颗128核心 2.25GHz AMD EPYC 9754 内存&#xff1a;24根96GB DDR5 4800MHz ECC REG 硬盘&#xff1a;1块1TB U.2 SSD系统盘1块15.36TB U.2热数据盘…

2024 年 电工杯(A题)大学生数学建模挑战赛 | 园区微电网风光储协调| 数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 CS团队倾注了大量时间和心血&#xff0c;深入挖掘解决方案。通…

pip换源ubuntu

到THU网站上有给定的教程 https://mirrors.tuna.tsinghua.edu.cn/help/pypi/ 方法1 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package然后在https://pypi.org/project/nvidia-cublas-cu12/#files 里面搜索你的包名 方法2 python -m pip install --upg…

计算机毕业设计python+django医院住院挂号登记收费系统7ui9s

在该医院信息管理系统中&#xff0c;python技术可以给用户带来极大方便&#xff0c;其主要特点就是可以使用户学习起来方便、快捷&#xff0c;另一方面就是信息储存量也是非常大的&#xff0c;该功能主要被应用为数据库中进行查询和编程。并且该功能的数据应用比较灵活&#xf…

JVM优化之使用Jstack命令查找JVM死锁

JVM优化之使用Jstack命令查找JVM死锁 示例代码 public class DeadLockDemo {private static Object lock1 new Object();private static Object lock2 new Object();public static void main(String[] args) {new Thread(() -> {synchronized (lock1) {try {System.out.p…

新品 | Forge® 1GigE IP67工业相机助力智能农业、食品和饮料行业

近日&#xff0c;51camera的合作伙伴Teledyne FLIR IIS推出Forge 1GigE IP67,它是Forge系列的最新工业相机&#xff0c;旨在在恶劣的工业环境中运行&#xff0c;同时确保高效的生产能力。Forge 1GigE IP67致力于为工厂自动化提供先进成像系统的最新产品。 Forge 1GigE IP67相机…

Spring Cloud整合Sentinel

1、引入依赖 链接: 点击查看依赖关系 父pom <spring.cloud.version>Hoxton.SR12</spring.cloud.version> <spring.cloud.alibaba.version>2.2.10-RC1</spring.cloud.alibaba.version>Sentinel应用直接引用starter <dependency><groupId&…