谷歌笔试题 --- 环状链表去重

编码实现环状单向链表(尾指针直接指向头指针,中间没有空节点),去除连续的重复元素的操作。

比如:1(头)->2->2->3->3->1->1(头) 去除以后的结果是1->2->3,注意头尾的1也要去掉一个。

//时间复杂度为O(N)
//空间复杂度为O(1)

//代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <climits>
#include <cmath>
#include <queue>
#include <cassert>
#include <algorithm>
#define MAXN 10010
#define RST(N)memset(N, 0, sizeof(N))
using namespace std;

typedef int data_t;

typedef struct ListNode
{
    data_t data;
    struct ListNode *next;
}LNode, *pNode;

pNode Create(int n, int *hashTable)
{
    pNode head = NULL;
    pNode p1 = NULL, p2 = NULL;
    p1 = p2 = (pNode)malloc(sizeof(LNode));
    while(n--)
    {
        cin >> p1->data;
        hashTable[p1->data]++;   //统计
        if(head == NULL)
            head = p1;
        else
            p2->next = p1;
        p2 = p1;
        p1 = (pNode)malloc(sizeof(LNode));
    }
    p2->next = head;    //指向头
    return head;
}

void uniqueListNode(pNode head, int *hashTable)
{
    assert(head != NULL);
    pNode pre = head;
    pNode cur = head->next;
    while(cur != head && cur != NULL)   //去重
    {
        pNode p = cur;
        pNode Next = cur->next;
        if(hashTable[cur->data] == 1)
            pre = cur;
        else if(hashTable[cur->data] > 1)
        {
            hashTable[cur->data]--;
            pre->next = Next;
            free(p);    //释放
        }
        cur = Next;
    }
}

int main()
{
    int n;
    while(cin >> n)
    {
        int hashTable[MAXN] = {0};   //hash存储出现的次数
        pNode head = Create(n, hashTable);    //构造一个环状单链表
        uniqueListNode(head, hashTable);   //去重
        /***** result *****/
        cout << head->data << "->";
        for(pNode p=head->next; p!=head; p=p->next)
        {
            cout << p->data;
            if(p->next != head) cout << "->";
            else cout << endl;
        }
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 13:28:08

谷歌笔试题 --- 环状链表去重的相关文章

2013谷歌笔试题

个人信息:就读于燕大本科软件工程专业 目前大四; 本人博客:google搜索"cqs_2012"即可; 个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献; 编程语言:C++ ; 编程坏境:Windows 7 专业版 x64; 编程工具:vs2010; 制图工具:office 2010 powerpoint; 硬件信息:7G-3 笔记本; 题目 写函数,输出前N个素数.不需要考虑整数溢出问题,也不需要使用大数处理算法. 思路 个人思路对每个奇数去检验是否是素数,检验

58同城笔试题:数组去重;分饼干(分糖果);最小路径和(leetcode64)

1. 数组去重 题目描述 /** * 有序数组去重 * 输出最终的数字个数 * 输入:1,2,2 * 输出:2 * @author Turing * */ 代码 import java.util.*; public class E { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String[] str = sc.nextLine().split(","); int len

谷歌笔试题&mdash;&mdash;排序,只允许0和其他元素交换

2.2 长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap,请设计并实现排序. 这题有一个隐含条件:即数组元素是连续的,即0--n-1,当你排好序后,你会发现数组元素和该元素的下标是相等的. 思路:以数组2 0 3 1为例 1.首先a[0]=2,按照上述条件它应该放在a[2]的位置上.因为只允许0元素和其他元素的交换.所以不能直接交换a[0]和a[2],所以将0元素和a[2]互换,得到2 3 0 1,然后就可以把a[0]=2和a[2]=0互换了,得到0 3 2 1 按照这个思

谷歌2013校招全套笔试题

1.1 B 1G字节的数据需要处理1G次.而当代pc的频率的数量级就是GHZ级的(我的PC是2.5GHZ) 1.2 D 为了高效利用流水线而调整指令的顺序就可以减少指令的运行时间. 1.3  B sprintf用于将格式化的数据写入缓冲区. foo()函数返回的是一个数组地址,但是该数组(X)是一个局部变量,在foo()函数调用结束后该地址就成为了无效地址.如果地址中的内容没有改变的话就会输出world.当然,如果该地址呗回收,就会输出错误信息. 1.4 A (x1-1)+(x2+1)+(x3+

也许你需要点实用的-Web前端笔试题

之前发的一篇博客里没有附上答案,现在有空整理了下发出来,希望能帮助到正在找工作的你,还是那句话:技术只有自己真正理解了才是自己的东西,共勉. Web前端笔试题 Html+css 1.对WEB标准以及w3c的理解与认识. 标签闭合,标签小写,不乱嵌套:提高搜索机器人的搜索几率: 使用外联的css和js,结构行为表现的分离:文件下载与页面加载速度更快,内容能被更广泛的设备所访问: 更少的代码和组件:容易维护,改版方便,不需要变动页面内容,提供打印版本而不需要复制内容,提高网站的易用性. 2.Xhtm

广联达北邮笔试题

广联达北邮宣讲笔试题 编程题 1.链表相比于数组不是其优点的是:存储空间小. 2.一群不同年龄的人,找出最小的年龄的差值(绝对值),时间复杂度小于O(n^2) 我的思路是:用快排将年龄排序(从小到大),然后用次小年龄减去最小年龄就是最小年龄差. 3.删除单向链表的给定的结点,时间复杂度为O(1) 链表结点定义: struct linknode{ int key; linknode * next } 剑指offer有此题. 思路:用给定结点的下一节点的值覆盖给定结点的值,然后将下一节点删除. 假设

史上最难PHPer笔试题,40分就能月薪过万!附答案

请批判性的学习,欢迎大牛指正错误 1.有关PHP字符串的说法,不对的是:A.如果一个脚本的编码是 ISO-8859-1,则其中的字符串也会被编码为 ISO-8859-1.B.PHP的字符串在内部是字节组成的数组,用花括号访问或修改字符串对多字节字符集很不安全.C.substr().strpos().strlen().htmlentities() 处理字符串时依据的编码方式是相同的.D.一个布尔值 Boolean 的 true 被转换成 string 的 " 1 ",false 被转换成

新浪PHP开发工程师面试笔试题

找实习找的心累,于是在学校bbs上找了一个新浪的散招. 先做了一份笔试题,题目如下. 1.列举一下你知道的Unix信号,并说明其用途 2.给你一个ip地址,写出其无符号32位的表示法 3.给你一些http的东西post请求,数据,cookie,URL,写一个http头. 4.简述一些shell命令 top/mv/find/sar/touch/wc/chmod/df/strace 5.用PHP写一个程序,打印出本月日历 6.简单的SQL查询.有一个取手机号的后四位,不会. 取某几位好像可以用SUB

2014阿里巴巴WEB前端实习生在线笔试题

2014年3月31日晚,我怀着略微忐忑的心情(第一次在线笔试^_^!!)进行了笔试,阿里巴巴的笔试题共有10道,几乎包含了Web前端开发的各个方面,有程序题.有叙述题,时间非常紧张,只完成了大概6道题.下面把遇到的题目跟大家分享一下! 1. <pre name="code" class="html"><!doctype html> <html> <head> <style type="text/css&