每日编程(41)

分隔链表

题目描述:
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。

你应当保留两个分区中每个节点的初始相对位置。然后指针后移寻找下一个位置

示例:

输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5

分析:
这是一道操作链表的题,定义两个指针,像快排是的,分别去找符合要求的节点,然后将后面符合要求的节点插到前面节点的前面。

代码:

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func partition(head *ListNode, x int) *ListNode {
    if head==nil || head.Next==nil{
        return head
    }
    dummy:=&ListNode{}
    dummy.Next=head
    pre:=dummy
    
    for pre.Next!=nil && pre.Next.Val<x{
        pre=pre.Next
    }
    if pre.Next==nil{
        return dummy.Next
    }
    p1:=pre.Next
    p2:=p1.Next
    for p2!=nil{
        if p2.Val>=x{
            p1=p2
            p2=p1.Next
        }else{
            p1.Next=p2.Next
            p2.Next=pre.Next
            pre.Next=p2
            pre=p2
            p2=p1.Next
        }
    }
    return dummy.Next
}

题目:回文链表

题目描述:
请判断一个链表是否为回文链表。

示例 1:

输入: 1->2
输出: false
示例 2:

输入: 1->2->2->1
输出: true

分析:
定义快慢指针,找到中间节点,然后反转后半部分链表,然后两边进行比较,是否一样
代码:

func isPalindrome(head *ListNode) bool {
	if head==nil || head.Next==nil{
		return true
	}
	slow:=head
	fast:=head
	for fast.Next!=nil && fast.Next.Next!=nil{
		slow=slow.Next
		fast=fast.Next.Next
	}
	cur:=slow.Next
	slow.Next=nil
	var prv *ListNode
	for cur.Next!=nil{
		node:=cur.Next
		cur.Next=prv
		prv=cur
		cur=node
	}
	
	cur.Next=prv

	for head!=nil && cur!=nil{
		if head.Val != cur.Val{
			return false
		}
		head=head.Next
		cur=cur.Next
	}
	return true
}

题目:1029. 可被 5 整除的二进制前缀

题目描述:
给定由若干 0 和 1 组成的数组 A。我们定义 N_i:从 A[0] 到 A[i] 的第 i 个子数组被解释为一个二进制数(从最高有效位到最低有效位)。

返回布尔值列表 answer,只有当 N_i 可以被 5 整除时,答案 answer[i] 为 true,否则为 false。

示例 1:

输入:[0,1,1]
输出:[true,false,false]
解释:
输入数字为 0, 01, 011;也就是十进制中的 0, 1, 3 。只有第一个数可以被 5 整除,因此 answer[0] 为真。
示例 2:

输入:[1,1,1]
输出:[false,false,false]
示例 3:

输入:[0,1,1,1,1,1]
输出:[true,false,false,false,true,false]
示例 4:

输入:[1,1,1,0,1]
输出:[false,false,false,false,false]

分析:
所有的数被5整除就是五个状态,0,1,2,3,4,然后增加以为后就是在原来的基础上乘2加上新增的数,然后再判断他的状态,如果是0说明能被5整除。
代码:
func prefixesDivBy5(A []int) []bool {
n:=len(A)
res:=[]bool{}
if n<1{
return res
}
ret:=[][]int{
{0, 1},
{2, 3},
{4, 0},
{1, 2},
{3, 4},
}
state:=0
for i:=0;i<n;i++{
state=ret[state][A[i]]
if state==0{
res=append(res,true)
}else{
res=append(res,false)
}
}
return res
}

猜你喜欢

转载自blog.csdn.net/LYue123/article/details/88940725
41