搜索
有爱,有技术,有你^_^)y
╱人◕‿‿◕人╲订下契约(注册新用户)

合作站点账号登陆

QQ登录

只需一步,快速开始

快捷导航
查看: 820|回复: 15
收起左侧

【趣味编程】获取公共路径

[复制链接]

该用户从未签到

10

主题

5

好友

1441

积分

Continue

积分
1441
发表于 2012-4-14 13:36:06 | 显示全部楼层 |阅读模式

╱人◕‿‿◕人╲定下契约

您需要 登录 才可以下载或查看,没有账号?╱人◕‿‿◕人╲订下契约(注册新用户)

x
本帖最后由 LonghronShen 于 2012-4-15 10:10 编辑

输入:给定一个字符串数组,包含若干个路径;
请用你熟悉的技术编写一段代码以实现获取这些路径的公共部分。
注意:需要考虑UNC路径,以及非法路径的处理。

输入:string[], 输出:string

测试样例1:
C:\Test\01\01.txt
C:\Test\02\02.txt
C:\Test\Other\Other.txt
输出:C:\Test\

测试样例2:
\\127.0.0.1\Test\01\01.txt
\\127.0.0.1\Test\02\02.txt
\\127.0.0.1\Test\Other\Other.txt
输出:\\127.0.0.1\Test\

测试样例3:
C:\Test\01\01.txt
C:\Test\02\02.txt
C:\Test\Other\Other.txt
D:\Test\03\03.txt
输出:"",因为找不到公共部分。

测试样例4:
C:\Test\01\01.txt
C:\Test\02\02.txt
C:\Test\\Other\Other.txt
输出:抛出异常,因为存在非法路径。

UNC (Universal Naming Convention): 通用命名规则,也叫通用命名规范、通用命名约定。 网络(主要指局域网)上资源的完整 Windows主机名称。它符合 \\servername\sharename 格式,其中 servername 是服务器名,sharename 是共享资源的名称。目录或文件的 UNC 名称可以包括共享名称下的目录路径,格式为: \\servername\sharename\directory\filename。
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复

使用道具 举报

该用户从未签到

28

主题

103

好友

9783

积分

技术宅认证程序员

苦逼,受剥削人民

积分
9783
发表于 2012-4-14 15:06:17 | 显示全部楼层
C#
  1. private void button2_Click(object sender, EventArgs e)
  2.         {            
  3.             //OpenFileDialog o = new OpenFileDialog();
  4.             //o.Multiselect = true;
  5.             //o.ShowDialog();            
  6.             //string[] path= o.FileNames;

  7.             List<string[]> st = new List<string[]>();
  8.             string re = "";
  9.             string[] path = {@"E:\Program Files (x86)\eclipse\p2",
  10.                             @"E:\Program Files (x86)\eclipse\p2\org.eclipse.equinox.p2.engine\.settings",
  11.                             @"E:\Program Files (x86)\eclipse\p2\org.eclipse.equinox.p2.engine\profileRegistry",
  12.                             @"E:\Program Files (x86)\eclipse\p2\org.eclipse.equinox.p2.repository",
  13.                             @"E:\Program Files (x86)\eclipse\features"};
  14.            
  15.             int min = 100;            
  16.             foreach (var p in path)
  17.             {
  18.                 if ((Path.GetDirectoryName(p)) == "")
  19.                     break;
  20.                 string[] paths = p.Split('\\');
  21.                 if(paths.Length<min)   min = paths.Length;
  22.                
  23.                 st.Add(paths);
  24.             }

  25.             for (int i = min-1; i >= 0; i--)
  26.             {
  27.                 bool bl = true;
  28.                 for (int j = 0; j < st.Count; j++)
  29.                 {
  30.                     for (int k = j; k < st.Count; k++)
  31.                     {
  32.                         if (st[j][i] != st[k][i]) bl = false;
  33.                     }
  34.                 }
  35.                 if (bl) re= st[0][i] + @""+re;
  36.             }
  37.             MessageBox.Show(re);
  38.         }
复制代码
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

11

好友

1715

积分

Continue

积分
1715
发表于 2012-4-15 01:04:00 | 显示全部楼层
[UNC路径,以及非法路径]
???
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

8

主题

11

好友

3239

积分

序章

积分
3239
发表于 2012-4-15 01:45:04 | 显示全部楼层
我该吐槽“趣味”么=-=~~~这两天头很疼没啥码代码的思路 ~明天看看再说~
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

163

主题

73

好友

4万

积分

第二章

积分
45516
发表于 2012-4-15 10:01:19 | 显示全部楼层
#16!死了   看不懂
[url=http://www.gn00.com/forum-110-1.html]<font color="DarkOrange">跟着船长起航
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

5

好友

1441

积分

Continue

积分
1441
 楼主| 发表于 2012-4-15 10:11:00 | 显示全部楼层
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

163

主题

73

好友

4万

积分

第二章

积分
45516
发表于 2012-4-15 13:51:56 | 显示全部楼层

虽然没完全看懂,但是C#真方便啊........看来真的超多自带的东西.......
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

28

主题

103

好友

9783

积分

技术宅认证程序员

苦逼,受剥削人民

积分
9783
发表于 2012-4-15 18:09:47 | 显示全部楼层
挨T虫穴 发表于 2012-4-15 13:51
虽然没完全看懂,但是C#真方便啊........看来真的超多自带的东西.......

不至于看不懂吧
我这里面用了2个自带的东西
一个是获取分割的字符串
一个是获取字符串路径的上级目录
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

8

主题

11

好友

3239

积分

序章

积分
3239
发表于 2012-4-16 00:34:48 | 显示全部楼层
本帖最后由 Flagalac 于 2012-4-16 00:50 编辑

C#秋君已经写了我就写个易语言的吧=-=图稍后补上
P.S1:引用了超级模块6.5版本(编码转换类神马的)
P.S2:这两天状态不佳~有点感冒+头痛 ~码代码效率超级慢~所以现在才发来~迟了点~
  1. .版本 2

  2. .程序集 程序集1

  3. .子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行
  4. .局部变量 路径集, 文本型, , "0"
  5. .局部变量 子路径集, 文本型, , "0"
  6. .局部变量 输入文本, 文本型
  7. .局部变量 编码转换类, 编码转换类
  8. .局部变量 i, 整数型
  9. .局部变量 j, 整数型
  10. .局部变量 分割文本数组, 文本型, , "0"
  11. .局部变量 公共路径, 文本型
  12. .局部变量 开始点, 整数型

  13. 标准输出 (, “输入路径” + 到文本 (取数组成员数 (路径集) + 1) + “(停止输入请留空)” + #换行符)
  14. 输入文本 = 标准输入 ()
  15. .判断循环首 (输入文本 ≠ 编码转换类.USC2转Ansi (“000A0000”))
  16. 加入成员 (路径集, 输入文本)
  17. 标准输出 (, “输入路径” + 到文本 (取数组成员数 (路径集) + 1) + “(停止输入请留空)” + #换行符)
  18. 输入文本 = 标准输入 ()
  19. .判断循环尾 ()
  20. .如果 (取数组成员数 (路径集) > 1)
  21. 重定义数组 (子路径集, 假, 取数组成员数 (路径集), 1)
  22. .否则
  23. 标准输出 (, “输入成员数量不足”)
  24. 标准输入 ()
  25. 返回 (0)
  26. .如果结束

  27. .计次循环首 (取数组成员数 (路径集), i)
  28. 分割文本数组 = 分割文本 (路径集 [i], “\”, )

  29. .如果真 (取数组下标 (子路径集, 2) < 取数组成员数 (分割文本数组))
  30. 重定义数组 (子路径集, 真, 取数组成员数 (路径集), 取数组成员数 (分割文本数组))
  31. .如果真结束

  32. .计次循环首 (取数组成员数 (分割文本数组), j)
  33. 子路径集 [i] [j] = 分割文本数组 [j]
  34. .计次循环尾 ()
  35. .计次循环尾 ()

  36. .计次循环首 (取数组成员数 (路径集), i)


  37. 开始点 = 寻找文本 (路径集 [i], “\”, 开始点 + 1, 假)
  38. .判断循环首 (开始点 ≠ -1)
  39. .如果 (取文本中间 (路径集 [i], 开始点 + 1, 1) = “\” 且 开始点 ≠ 1)
  40. 标准输出 (, “路径非法”)
  41. 标准输入 ()
  42. 返回 (0)

  43. .否则

  44. .如果结束

  45. 开始点 = 寻找文本 (路径集 [i], “\”, 开始点 + 1, 假)

  46. .判断循环尾 ()

  47. 开始点 = 0
  48. .计次循环尾 ()
  49. .计次循环首 (取数组成员数 (路径集) - 1, i)
  50. .计次循环首 (取数组下标 (子路径集, 2) - 1, j)
  51. .如果 (子路径集 [i] [j] = 子路径集 [i + 1] [j])
  52. .如果真 (i = 取数组成员数 (路径集) - 1)
  53. 公共路径 = 公共路径 + 子路径集 [i] [j] + “\”
  54. .如果真结束

  55. .否则
  56. 跳出循环 ()
  57. 跳出循环 ()
  58. .如果结束

  59. .计次循环尾 ()
  60. .计次循环尾 ()
  61. .如果 (公共路径 ≠ “”)
  62. 标准输出 (, 公共路径)
  63. .否则

  64. .如果结束
  65. 标准输入 ()
  66. 返回 (0)
复制代码

                               
登录/注册后可看大图


                               
登录/注册后可看大图


                               
登录/注册后可看大图

评分

参与人数 1宅魂 +1 收起 理由
LonghronShen + 1 Σ( ° △ °|||)︴给跪了!

查看全部评分

签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

20

主题

64

好友

5805

积分

序章

积分
5805
发表于 2012-4-17 19:45:21 | 显示全部楼层
我应该说C#方便在他是用了面向对象的吧!这个倒可以减少不是的代码量!但个人比较偏爱java表T我,我只是随便说说
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

5

好友

1441

积分

Continue

积分
1441
 楼主| 发表于 2012-4-17 20:24:41 | 显示全部楼层
夏默然 发表于 2012-4-17 19:45
我应该说C#方便在他是用了面向对象的吧!这个倒可以减少不是的代码量!但个人比较偏爱java表T我,我只 ...

这里又不是微软社区……你用Java也可以答题……的确存在语法习惯问题,但是也得客观看待语言之间的功能差异,针对目标程序,选择合适语言就行了,不要试图找到一种通吃一切领域的编程语言,那玩意儿永远不存在。
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

20

主题

64

好友

5805

积分

序章

积分
5805
发表于 2012-4-17 21:15:35 | 显示全部楼层
LonghronShen 发表于 2012-4-17 20:24
这里又不是微软社区……你用Java也可以答题……的确存在语法习惯问题,但是也得客观看待语言之间的功能差 ...

因为喜欢网页所以对java比较有爱!而且个人觉得java在书写上确实比C#好,更靠近底层,但是C#的面向对象确实很赞,很节省代码量!二者各有优点!并没有嫌弃C#的意思,相反我现在也在从事C#方面的工作
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

21

好友

1万

积分

第一章

积分
11622
发表于 2012-4-18 16:20:11 | 显示全部楼层
本帖最后由 小野千帆 于 2012-4-18 16:36 编辑

java
楼主给出的例子均测试通过
--------
论坛这贴代码的东西有bug吧好像- -
  1.                 String[] s={"C:\\Test\\01\\01.txt","C:\\Test\\02\\02.txt","C:\\Test\\\\Other\\Other.txt" };
  2.                 String[][] temp=new String[s.length][];
  3.                 boolean flag=true;
  4.                 for(int i=0;i<s.length;i++){//非法路径也就是"\"不在开头→应该写个正则来验证的 - -
  5.                         if(s[i].contains("\\\")&&s[i].indexOf("\\\")!=0){
  6.                                 System.out.print("抛出异常");
  7.                                 flag=false;
  8.                         }
  9.                 }
  10.                 if(flag){
  11.                         for(int i=0;i<s.length;i++){
  12.                                 temp[i]=s[i].split("\\\");
  13.                         }               
  14.                 z:        for(int i=0;i<temp.length-1;i++){
  15.                                 for(int j=0;j<temp[i].length-1;j++){
  16.                                         if(!temp[i][j].equals(temp[i+1][j])){
  17.                                                 break z;
  18.                                         }
  19.                                         System.out.print(temp[i][j]+"\");
  20.                                 }
  21.                         }
  22.                 }
复制代码
gal初心者
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

5

好友

1441

积分

Continue

积分
1441
 楼主| 发表于 2012-4-18 16:31:57 | 显示全部楼层
小野千帆 发表于 2012-4-18 16:20
java
楼主给出的例子均测试通过
--------

感谢你的答题哈~~其实我更喜欢自己用RTF着色~~
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

1

好友

3402

积分

序章

积分
3402
发表于 2012-5-9 13:23:11 | 显示全部楼层
本帖最后由 johnnyworm 于 2012-5-9 13:30 编辑
小野千帆 发表于 2012-4-18 16:20
java
楼主给出的例子均测试通过
--------

不对吧…… [mw_shl_code=java,false]print(temp[ i ][ j ]+"\\")[/mw_shl_code]怎么能在第二层for里面呢……这样没测试完就输出了= =

而且循环行在外面列在里面也不对劲……成了每两行找公共路径然后输出,然后找下两行
如果有测试用例是
C:\Test\01\01.txt
C:\Test\01\02.txt
D:\other\other.txt
还是会输出C:\Test\01\
/*测试用例3就会输出C:\Test\的吧……*/

给【i】跪了……变斜体了orz
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

本版积分规则

小黑屋|手机版|技术宅(Z站|基宅) ( 粤ICP备18082987号-1 )

GMT+8, 2025-5-1 09:22 , Processed in 0.160129 second(s), 35 queries , Redis On.

Copyright © 2018 技术宅社区

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表