每日一练 —2021.12.19


一、N皇后 ||

1,程序简介

  • n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
  • 给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。
示例 1:

在这里插入图片描述

  • 输入:n = 4
  • 输出:2
  • 解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
  • 输入:n = 1
  • 输出:1

提示:

1 <= n <= 9
皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。

2,程序代码

# -*- coding: utf-8 -*-
"""
Created on Sun Dec 19 13:01:01 2021
Function:
@author: 小梁aixj
"""
class Solution(object):
    def __init__(self):
        self.count = 0
    def totalNQueens(self, n):
        self.dfs(0, n, 0, 0, 0)
        return self.count
    def dfs(self, row, n, column, diag, antiDiag):
        if row == n:
            self.count += 1
            return 
        for index in range(n):
            isColSafe = (1 << index) & column == 0
            isDigSafe = (1 << (n - 1 + row - index)) & diag == 0
            isAntiDiagSafe = (1 << (row + index)) & antiDiag == 0
            if isAntiDiagSafe and isColSafe and isDigSafe:
                self.dfs(row + 1, n, (1 << index) | column, 
                         (1 << (n - 1 + row - index)) | diag, 
                         (1 << (row + index)) | antiDiag)
if __name__=="__main__":
    s = Solution()
    print(s.totalNQueens(4)) #2

3,运行结果

在这里插入图片描述

二、删除链表的倒数第N 个结点

1,程序简介

  • 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
  • 进阶:你能尝试使用一趟扫描实现吗?
示例 1:

在这里插入图片描述

  • 输入:head = [1,2,3,4,5], n = 2
  • 输出:[1,2,3,5]
示例 2:
  • 输入:head = [1], n = 1
  • 输出:[]
示例 3:
  • 输入:head = [1,2], n = 1
  • 输出:[1]

提示:

链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz

以下程序实现了这一功能,请你填补空白处内容:

struct ListNode
{
	int val;
	ListNode *next;
	ListNode() : val(0), next(nullptr) {}
	ListNode(int x) : val(x), next(nullptr) {}
	ListNode(int x, ListNode *next) : val(x), next(next) {}
};
#include <vector>
class Solution
{
public:
	ListNode *removeNthFromEnd(ListNode *head, int n)
	{
		ListNode empty_node(0, head);
		ListNode *p = &empty_node;
		std::vector<ListNode *> pv;
		while (p != nullptr)
		{
			pv.push_back(p);
			p = p->next;
		}
		_________________
		p->next = p->next->next;
		return empty_node.next;
	}
};

2,程序代码

# -*- coding: utf-8 -*-
"""
Created on Sun Dec 19 13:01:42 2021
Function:
@author: 小梁aixj
"""
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
class LinkList:
    def __init__(self):
        self.head=None
    def initList(self, data):
        self.head = ListNode(data[0])
        r=self.head
        p = self.head
        for i in data[1:]:
            node=ListNode(i)
            p.next = node
            p = p.next
        return r
    def convert_list(self,head):
        ret = []
        if head == None:
            return
        node = head
        while node != None:
            ret.append(node.val)
            node = node.next
        return ret
class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        v = ListNode(0, head)
        handle = v
        index = []
        while v is not None:
            index.append(v)
            v = v.next
        pre = len(index)-n-1
        next = len(index)-n+1
        index[pre].next = index[next] if next >= 0 and next < len(index) else None
        return handle.next
# %%
l = LinkList()
list1 = [1,2,3,4,5]
head = l.initList(list1)
n = 2
s = Solution()
print(l.convert_list(s.removeNthFromEnd(head, n)))

3,运行结果

在这里插入图片描述

三、交错字符串

1,程序简介

  • 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。

两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:

s = s1 + s2 + ... + sn
t = t1 + t2 + ... + tm
|n - m| <= 1
交错 是 s1 + t1 + s2 + t2 + s3 + t3 + ... 或者 t1 + s1 + t2 + s2 + t3 + s3 + ...

提示:a + b 意味着字符串 a 和 b 连接。

示例 1:

在这里插入图片描述

  • 输入:s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”
  • 输出:true
示例 2:
  • 输入:s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”
  • 输出:false
示例 3:
  • 输入:s1 = “”, s2 = “”, s3 = “”
  • 输出:true

提示:

0 <= s1.length, s2.length <= 100
0 <= s3.length <= 200
s1、s2、和 s3 都由小写英文字母组成

以下程序实现了这一功能,请你填补空白处内容:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
static bool isInterleave(char *s1, char *s2, char *s3)
{
	int i, j;
	int len1 = strlen(s1);
	int len2 = strlen(s2);
	int len3 = strlen(s3);
	if (len1 + len2 != len3)
	{
		return false;
	}
	bool *table = malloc((len1 + 1) * (len2 + 1) * sizeof(bool));
	bool **dp = malloc((len1 + 1) * sizeof(bool *));
	for (i = 0; i < len1 + 1; i++)
	{
		dp[i] = &table[i * (len2 + 1)];
	}
	dp[0][0] = true;
	for (i = 1; i < len1 + 1; i++)
	{
		dp[i][0] = dp[i - 1][0] && s1[i - 1] == s3[i - 1];
	}
	for (i = 1; i < len2 + 1; i++)
	{
		____________________
	}
	for (i = 1; i < len1 + 1; i++)
	{
		for (j = 1; j < len2 + 1; j++)
		{
			bool up = dp[i - 1][j] && s1[i - 1] == s3[i + j - 1];
			bool left = dp[i][j - 1] && s2[j - 1] == s3[i + j - 1];
			dp[i][j] = up || left;
		}
	}
	return dp[len1][len2];
}
int main(int argc, char **argv)
{
	if (argc != 4)
	{
		fprintf(stderr, "Usage: ./test s1 s2 s3\n");
		exit(-1);
	}
	printf("%s\n", isInterleave(argv[1], argv[2], argv[3]) ? "true" : "false");
	return 0;
}

2,程序代码

# -*- coding: utf-8 -*-
"""
Created on Sun Dec 19 13:02:27 2021
Function:
@author: 小梁aixj
"""
class Solution(object):
    def isInterleave(self, s1, s2, s3):
        if len(s1) + len(s2) != len(s3):
            return False
        queue = [(0, 0),(-1, -1)]
        visited = set()
        index = 0
        while len(queue) != 1 or queue[0][0] != -1:
            p = queue.pop(0)
            if p[0] == len(s1) and p[1] == len(s2):
                return True
            if p[0] == -1:
                queue.append(p)
                index += 1
                continue
            if p in visited:
                continue
            visited.add(p)
            if p[0] < len(s1):
                if s1[p[0]] == s3[index]:
                    queue.append((p[0] + 1, p[1]))
            if p[1] < len(s2):
                if s2[p[1]] == s3[index]:
                    queue.append((p[0], p[1] + 1))
        return False
# %%
s=Solution()
print(s.isInterleave(s1 = 'aabcc', s2 = 'dbbca', s3 = 'aadbbbaccc'))

3,运行结果

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梁辰兴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值