[算法 笔记]2014年去哪儿网 开发笔试(续)第一题BUG修正

  上一篇的blog地址为:http://www.cnblogs.com/life91/p/3313868.html

  这几天又参加了一个家公司的笔试题,在最后的编程题中竟然出现了去哪儿网开发的第一题,也就是简化路径值。但是这次做题后,我发现我上次写的那个简化源码有很多问题,并且在这次笔试过程中也没有答对。闲话说完了,进入正题。

   上次源码出现的BUG

  1. 将连续重复的多个’/’字符视为一个。例如,”/abac/def//ef”->”/abac/def/ef”。

  2. 根目录的开始字符为’/’,并且根目录的上级目录以及上上级目录都是本身。例如,”/../../../”->”/”。

  3. 字符’.’作为后缀名的分割符号出现。例如,”/abc/ef.gif”->”/abc/ef.gif”

  4. 以字符’/’作为起始字符。

  上述是上次源码出现的BUG。在修正这些BUG中,将增加一个临时空间用于存储原始路径。在拷贝过程中将连续重复出现的’/’变为一个’/’,并且删除”/./”这种情况。同时检查参数路径是否合法,目前仅考虑一种情况:当’.’个数超过2个时,将退出。

 1     // preprocess.
 2     while ( index < len )
 3     {
 4         // merge duplicate character -- '/'
 5         for ( cnt = 0;
 6                 index < len && path[index] == '/';
 7                 ++index, ++cnt );
 8         if ( cnt > 0 )
 9         {
10             tmp_path[top++] = '/';
11         }
12 
13         // delete only dot
14         for ( cnt = 0;
15                 index < len && path[index] == '.';
16                 ++index, ++cnt );
17         // Case 1: delete one dot.
18         if ( top > 0 && tmp_path[top - 1] == '/' && cnt == 1 )
19         {
20             ++index;
21         }
22         // Case 2: copy two dots.
23         else if ( cnt == 2 )
24         {
25             index -= cnt;
26         }
27         // Case 3: if more than two dots, it is error.
28         else if ( cnt > 2 )
29         {
30             fprintf( stderr, "Error.\n" );
31             // Remember: after free memory, this function could leave.
32             free( tmp_path ), tmp_path = NULL;
33             free( result ), result = NULL;
34             return NULL;
35         }
36 
37         // copy other characters.
38         while ( index < len && path[index] != '/' )
39         {
40             tmp_path[top++] = path[index++];
41         }
42     }

 

  请注意:在异常退出函数时,需要将已分配的两个内存空间释放掉,并且将原始的指针指向NULL。防止内存泄漏问题。

  在后续的处理过程中,使用栈的思想来处理。当遇到连续的两个’.’时,将栈中元素弹出。如果当栈中元素全部退出的时候,将重置top节点。

 

 1         // Case 1: the number of '.' is 2;
 2         if ( top > 0 && cnt == 2 )
 3         {
 4             --top;
 5             while ( --top > 0 && result[top] != '/' );
 6         }
 7         // Case 2: "game.gif"
 8         else if ( top > 0 && result[top - 1] != '/' && cnt == 1 )
 9         {
10             result[top++] = '.';
11         }
12         // Case 3: "/../../../" -> "/"
13         else if ( top == 0)
14         {
15             ++top;
16         }            

 

  完整的源码并提供简单的测试源码:

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 #include <assert.h>
  5 
  6 
  7 char *normalize_path( const char *path )
  8 {
  9     char *result    = NULL;
 10     char *tmp_path  = NULL;
 11     int top         = 0;
 12     int cnt         = 0;
 13     int index       = 0;
 14     int len         = 0;
 15 
 16     assert( path != NULL && path[index] != '\0' && path[index] == '/' );
 17     len = strlen( path );
 18     result = (char *) malloc( sizeof(char) * (len + 1) );
 19     assert( result != NULL );
 20 
 21     tmp_path = (char *) malloc( sizeof(char) * (len + 1) );
 22     if ( tmp_path == NULL )
 23     {
 24         free( result ), result = NULL;
 25         return NULL;
 26     }
 27 
 28     // preprocess.
 29     while ( index < len )
 30     {
 31         // merge duplicate character -- '/'
 32         for ( cnt = 0;
 33                 index < len && path[index] == '/';
 34                 ++index, ++cnt );
 35         if ( cnt > 0 )
 36         {
 37             tmp_path[top++] = '/';
 38         }
 39 
 40         // delete only dot
 41         for ( cnt = 0;
 42                 index < len && path[index] == '.';
 43                 ++index, ++cnt );
 44         // Case 1: delete one dot.
 45         if ( top > 0 && tmp_path[top - 1] == '/' && cnt == 1 )
 46         {
 47             ++index;
 48         }
 49         // Case 2: copy two dots.
 50         else if ( cnt == 2 )
 51         {
 52             index -= cnt;
 53         }
 54         // Case 3: if more than two dots, it is error.
 55         else if ( cnt > 2 )
 56         {
 57             fprintf( stderr, "Error.\n" );
 58             // Remember: after free memory, this function could leave.
 59             free( tmp_path ), tmp_path = NULL;
 60             free( result ), result = NULL;
 61             return NULL;
 62         }
 63 
 64         // copy other characters.
 65         while ( index < len && path[index] != '/' )
 66         {
 67             tmp_path[top++] = path[index++];
 68         }
 69     }
 70 
 71     // other operators.
 72     tmp_path[top] = '\0';
 73     len = top;
 74     for ( index = 0, top = 0; index < len; )
 75     {
 76         // copy other characters except '.'
 77         while ( index < len && tmp_path[index] != '.' )
 78         {
 79             result[top++] = tmp_path[index++];
 80         }
 81 
 82         // count of point
 83         for ( cnt = 0; index < len && tmp_path[index] == '.'; ++index, ++cnt );
 84 
 85         // Case 1: the number of '.' is 2;
 86         if ( top > 0 && cnt == 2 )
 87         {
 88             --top;
 89             while ( --top > 0 && result[top] != '/' );
 90         }
 91         // Case 2: "game.gif"
 92         else if ( top > 0 && result[top - 1] != '/' && cnt == 1 )
 93         {
 94             result[top++] = '.';
 95         }
 96         // Case 3: "/../../../" -> "/"
 97         else if ( top == 0)
 98         {
 99             ++top;
100         }
101 
102     }
103     result[top] = '\0';
104 
105     // free memory
106     free( tmp_path ), tmp_path = NULL;
107 
108     return result;
109 }
110 
111 void output( const char *path )
112 {
113     char *result = NULL;
114 
115     result = normalize_path( path );
116     printf( "Original is %s\nResult is %s\n\n", path, result );
117     free( result ), result = NULL;
118 
119     free( result );
120     result = NULL;
121 }
122 
123 int main()
124 {
125     char *path1 = "/home/news/./../tmp/game/../";
126     char *path2 = "/../../../abc";
127     char *path3 = "/game/gif.big";
128     char *path4 = "///abc//..//edf/game.f";
129 
130     output( path1 );
131     output( path2 );
132     output( path3 );
133     output( path4 );
134 
135     return 0;
136 }
normalize_path

 

 

转载于:https://www.cnblogs.com/life91/p/3396941.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java封装264成flv,将H.264封装为FLV格式-Go语言中文社区

本文将介绍如何将H.264封装成flv格式。在看本文之间&#xff0c;建议先看一看下面两篇文章&#xff1a;首先说一说构建一个FLV文件需要什么&#xff1f;FLV Header FLv script tag FLV Video tag FLV Audio tag由于这里只是封装H.264&#xff0c;所以不包括Audio tag。下面将…

[转]iis7.5+win2008 出现 HTTP Error 503. The service is unavailable.

解决&#xff1a; 应用程序池启动32位应用程序 设置托管管道为集成 &#xff08;仍然有问题&#xff09; 试试以下方法&#xff1a; http://phpwind.me/1222.html 楼主 发表于: 2011-11-26 图片:123.png 访问网站之前 应用程序池是开启的 访问后 网页报503 service unavailabl…

sublime php运行环境,sublime php 运行环境

sublime php 运行环境sublime php 运行环境有时候需要用运行一段 PHP 代码&#xff0c;比如测试某个函数返回值等等&#xff0c;如果启动Http Server&#xff0c;再打开浏览器&#xff0c;那黄花菜都凉了。我们可以在 Sublime Text 3 中创建 php 的 build system&#xff0c;这…

用Java写有关早上的语录,实用的适合早上发的早安问候语语录汇编39句

实用的适合早上发的早安问候语语录汇编39句不管梦想是什么&#xff0c;只有带着淡然的态度&#xff0c;做好当前的事情。早安&#xff01;下面是小编精心准备的适合早上发的早安问候语39句,欢迎大家前来欣赏。1、世上除了生死&#xff0c;其它都是小事。不管遇到了什么烦心事&a…

JQuery合并表格单元格

转&#xff1a;http://www.cnblogs.com/xuguoming/p/3412124.html JQuery合并表格单元格 一、需求 如果存在一个表格&#xff0c;想把其中某一列内容相同的部分合并单元格&#xff0c;用JQ动态如何操作&#xff0c;原始表格如下&#xff1a; 合并单元格之后的表格如下&#xff…

[音视频]H264码流分析工具

[音视频]H264码流分析工具 CTI-TS EasyICE Elecardstreameyetools VideoEye H264VideoESViewer 学习H264码流&#xff0c;H264码流进行分析 http://blog.csdn.net/leixiaohua1020/article/details/17933821 H264BSAnalyzer https://github.com/latelee/H264BSAnalyzer.g…

手机型号识别 手机PID UID 驱动识别 数据库包

主要用在手机驱动识别,列如手机助手开发,都需要用到这个.QQ9711-5034 整套数据库以及源码包含如下&#xff1a; 1&#xff09; 包含1160 张手机外壳图片&#xff0c;78 个手机驱动文件。 2&#xff09; 支持192 个品牌&#xff0c;2293 款手机&#xff0c;还有山寨机没有统计进…

Chart.js学习

一、简介 Chart.js是一个基于HTML5的简单的面向对象的图表库&#xff0c;支持包括IE7和8的所有现代浏览器。图表库中有6种表&#xff0c;分别是&#xff1a;曲线图&#xff08;Linecharts&#xff09;、柱状图&#xff08;Barcharts&#xff09;、雷达图&#xff08;Radarchart…

php将图片导入,php中图片文件的导入,上传与下载

---------------------------------------------图片的导入-------------------------------------------------------------------图片的上传与下载上传图片:序号图片添加时间操作//打开目录$diropendir("./images");//遍历目录$i;while($freaddir($dir)){if($f!&qu…

用parsetInt解析数字,并求和

实现代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml" xml:lang"en"> <h…

oracle arp绑定mac地址,使用ARP命令来绑定IP和MAC地址

使用ARP命令来绑定IP和MAC地址前言&#xff1a;我本来没有想过写关于ARP绑定的文章&#xff0c;坦白的说一句&#xff0c;在你理解ARP工作的原理时&#xff0c;这其实比较简单。只是看到最近论坛很多人在问关于绑定IP和MAC地址的问题&#xff0c;所以才决定写这个文章&#xff…

阿里巴巴2013年实习生笔试题A

一、单项选择题 1.下列说法不正确的是&#xff1a;&#xff08;B&#xff09; A.SATA硬盘的速度速度大约为500Mbps/s B.读取18XDVD光盘数据的速度为1Gbps C.前兆以太网的数据读取速度为1Gpbs D.读取DDR3内存数据的速度为100Gbps 解析&#xff1a;有说B的&#xff0c;有说D的&am…

linux之间安全传输文件,使用SCP安全地传输文件[Linux] | MOS86

终端访问远程Linux机器的最常见方法是使用安全Shell(SSH)。要工作&#xff0c;Linux服务器需要运行SSH服务器(OpenSSH)&#xff0c;另一端需要一个SSH客户端&#xff0c;像Windows中的PuTTy&#xff0c;或者Linux上的ssh命令行工具&#xff0c;或者其他类似Unix的操作系统&…

putty远程登录linux有啥用,putty 自动远程登录linux

在实际的开发和学习中我们会频繁的使用某些远程登录工具&#xff0c;通过网络登录到linux系统中进行程序编写和调试。Putty是比较流行的工具&#xff0c;但是在putty下每次链接到远端linux都要重新输入用户名和密码&#xff0c;就显得有些麻烦了。那么&#xff0c;有没有什么方…

eclipse中对单独JS文件取消报错的处理

eclipse中对单独JS文件取消报错的处理 eclipse中js文件报错的情况&#xff0c;或许大家早已习以为常了&#xff0c;那么有什么好的方法可以将其忽略掉呢&#xff1f;如果你也在寻找此问题&#xff0c;那么本文或许可以帮助到你 - 忽略某个js文件报错的方法&#xff1a; Project…

c语言方向变量,C语言,变量与内存

一、数在计算机中的二进制表示符号位&#xff1a;最高位为符号位&#xff0c;正数该位为0&#xff0c;负数该位为1&#xff1b;原码&#xff1a;原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值反码&#xff1a;正数的反码是其本身&#xff1b;负数的反码是…

新距离

1、这是个现实的社会&#xff0c;感情不能当饭吃&#xff0c;贫穷夫妻百事哀。不要相信电影里的故事情节&#xff0c;那只是个供许多陌生人喧嚣情感的场所。只有不理智和不现实的人才相信。  2、给自己定目标&#xff0c;一年&#xff0c;两年&#xff0c;五年&#xff0c;也…

android开发 文件分享到应用,Android开发之——7.0适配之应用之间共享文件(FileProvider)...

前言Android 7.0强制启用了被称作StrictMode的策略&#xff0c;带来的影响就是你的App对外无法暴露file://类型的URI了。如果你使用Intent携带这样的URI去打开外部App(比如&#xff1a;打开系统相机拍照)&#xff0c;那么会抛出FileUriException异常。官方给出解决这个问题的方…

android涂鸦板保存功能,android实现涂鸦,保存涂鸦后的图片,清屏

自定义view的类&#xff0c;代码如下&#xff1a;[html]package com.xy.tuya;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android…

浏览器与服务器响应流程-----(转)

一. 解析域名地址为IP地址 浏览器DNS缓存&#xff1a;以Chrome为例&#xff0c;在浏览器窗口中输入chrome://net-internals/#dns&#xff0c;就可以查看当前浏览器DNS缓存记录&#xff0c;chrome的DNS缓存过期时间还是比较短的&#xff0c;大约为1分钟。 本机DNS缓存&#xff1…