一、N皇后 ||
1,程序简介
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。
示例 1:
输入:n = 4 输出:2 解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
提示:
1 <= n <= 9
皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。
2,程序代码
"""
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 ) )
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 ) { }
} ;
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,程序代码
"""
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 都由小写英文字母组成
以下程序实现了这一功能,请你填补空白处内容:
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,程序代码
"""
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,运行结果