go语言快速刷《程序员面试金典》(2)

字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。

示例1

输入:s1 = "waterbottle", s2 = "erbottlewat"
 输出:True

示例2

输入:s1 = "aa", "aba"
输出:False

func isFlipedString(s1 string, s2 string) bool {
    return len(s1) == len(s2) && strings.Contains(s2 + s2, s1)
}

编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。

示例1:

 输入:[1, 2, 3, 3, 2, 1]
 输出:[1, 2, 3]

把每一个节点后的相同节点全删掉即可。

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func removeDuplicateNodes(head *ListNode) *ListNode {
    ;
    for temp:=head;temp!=nil;temp=temp.Next{
        num:=temp.Val;
        for i:=temp;i!=nil && i.Next!=nil;{
            if(i.Next.Val==num){
                i.Next=i.Next.Next;
            }else{
                i=i.Next
            }
        }  
    }
    return head;
}

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

注意:本题相对原题稍作改动

示例:

输入: 1->2->3->4->5 和 k = 2
输出: 4

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func kthToLast(head *ListNode, k int) int {
    length:=0;
    for temp:=head;temp!=nil;temp=temp.Next{
        length++;
    }
    for i:=length-k;i>0;i--{
        head=head.Next;
    }
    return head.Val;
}

实现一种算法,删除单向链表中间的某个节点(即不是第一个或最后一个节点),假定你只能访问该节点。

 

示例:

输入:单向链表a->b->c->d->e->f中的节点c
结果:不返回任何数据,但该链表变为a->b->d->e->f

思路:把值修改为下一个节点的值,并删除下一个节点。

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func deleteNode(node *ListNode) {
    node.Val=node.Next.Val;
    node.Next=node.Next.Next;
}

 

你可能感兴趣的:(leetcode)