A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 帮助信息   /  2015-11-30 00:51  /  2646 人查看  /  32 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

yqlbd 中级黑马 2015-12-3 15:13:14
21#
  1. package test1203;

  2. public class Test02 {

  3.         public static void main(String[] args) {
  4.                 // TODO Auto-generated method stub
  5.                
  6.                 String s1 ="abcdef";
  7.                 String s2 ="abdcd";
  8.                 String s3 =method(s1,s2);
  9.                 System.out.println(s3);

  10.         }

  11.         public static String method(String s1, String s2) {
  12.                 // TODO Auto-generated method stub
  13.                 if(s1.length()<s2.length()){
  14.                         String temp = s1;
  15.                         s1 = s2;
  16.                         s2 = temp;
  17.                 }
  18.                
  19.                 for(int i = 0;i<s2.length();i++){
  20.                         for(int a =0,b=s2.length()-i;b<=s2.length();a++,b++){
  21.                                 String s3 = s2.substring(a, b);
  22.                                 if(s1.contains(s3))
  23.                                         return s3;
  24.                         }
  25.                        
  26.                 }
  27.                
  28.                 return null;
  29.         }

  30. }
复制代码


回复 使用道具 举报
受18楼启发。完善后的代码如下
package cn.itcast_01;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;

/*
* 思路:
*                 A:将小串转换成char数组
*                 B:使用String构造方法构造子串(公约数)(可以使用长度参数来构造子字符串)
*                 C:在大串中查找子串的索引
*                 D:不存在,索引返回-1,存在返回真实索引
*                 E:将子串去重复、按长度从大到小存储在TreeSet集合中
*                 F:将子串的长度存储在ArrayList集合中,之后对集合进行去重复和排序
*                 G:获取ArrayList集合最大索引处的值,即为最大公约数的长度,按长度在TreeSet集合中找出最大公约数
* 最大公约数:opfhapio  和  opfhapii
*/
public class FuxiDemo {

        public static void main(String[] args) {
                String maxStr = "dhfsdhifaospdifahfsdiopfhapioddhfsdhifaospdifahfsdiopfhapiid";
                String minStr = "sdhfopfhapioassdhfopfhapiias";
                method(maxStr, minStr);
        }

        private static void method(String s1, String s2) {
                String maxS;
                String minS;

                if (s1.length() > s2.length()) {
                        maxS = s1;
                        minS = s2;
                } else {
                        maxS = s2;
                        minS = s1;
                }

                // 这个集合用来存储所有公约数
                TreeSet<String> ts = new TreeSet<String>(new Comparator<String>() {
                        public int compare(String s1, String s2) {
                                int num = s2.length() - s1.length();
                                int num2 = num == 0 ? s2.compareTo(s1) : num;
                                return num2;
                        }
                });

                // 这个集合用来存储公约数的长度
                List<Integer> array = new ArrayList<Integer>();

                char[] chs = minS.toCharArray();
                // 第一个for循环用于控制截取的子字符串长度
                for (int x = chs.length - 1; x > 0; x--) {
                        // 用于控制截取的字符串
                        for (int y = 0; y + x < chs.length; y++) {
                                String temp = new String(chs, y, x);
                                // 子串与大串比较,返回索引,判断索引是否为-1,不为-1则存在
                                int index = maxS.indexOf(temp);
                                if (index != -1) {
                                        ts.add(temp);
                                        array.add(temp.length());
                                        continue;
                                }
                        }
                }
                // 对公约数的长度去重复、排序。最后索引位置的值即为最大公约数的长度
                for (int x = 0; x < array.size() - 1; x++) {
                        for (int y = x + 1; y < array.size(); y++) {
                                if (array.get(x) == array.get(y)) {
                                        array.remove(y);
                                        y--;
                                }
                        }
                }
                Collections.sort(array);

                System.out.println("公约数有:");
                for (String s : ts) {
                        System.out.println(s);
                }
                System.out.println("-------------------");

                System.out.println("公约数的长度有:");
                for (Integer i : array) {
                        System.out.println(i);
                }
                System.out.println("-------------------");

                System.out.println("最大公约数有:");
                for (String s : ts) {
                        if (s.length() == array.get(array.size() - 1)) {
                                System.out.println(s);
                        } else if (s.length() < array.get(array.size() - 1)) {
                                break;
                        }
                }
        }
}
回复 使用道具 举报
好吧 看来自己真的得在多努力了
回复 使用道具 举报
一道想不出来不影响很大吧
回复 使用道具 举报
看着很难。。。。
回复 使用道具 举报
好多大神啊
回复 使用道具 举报
来顶一下
回复 使用道具 举报
sun4w 中级黑马 2015-12-4 09:21:31
28#
这个很厉害 要学习一下 哈哈
回复 使用道具 举报
星晴。 来自手机 中级黑马 2015-12-4 12:02:24
29#
这个题目不错,记住了
回复 使用道具 举报
找出字符串最小的那个定义成min最大的定义成max,然后对min进行截取,与max进行比较,直到相同就为最大公约数,
回复 使用道具 举报
乌鲁特 来自手机 中级黑马 2015-12-4 12:47:59
31#
哎,看书去了,T^T
回复 使用道具 举报
String str1 = "ijsfajk";
                String str2 = "qhsfqal";
                String str = "";
                TreeMap<Integer,String > map = new TreeMap<>();
                ArrayList<Integer>list=new ArrayList<>();
                for (int i = 0; i < str2.length(); i++) {
                        for (int j = i; j < str2.length(); j++) {
                                str = str2.substring(i, j + 1);
                                if (str1.contains(str)) {
                                        map.put(str.length(), str);
                                }
                        }
                }
                for (int key : map.keySet()) {
                        list.add(key);
                }
                Collections.sort(list);
                list.get(list.size()-1);
                map.get(list.get(list.size()-1));
                System.out.println(map.get(list.get(list.size()-1)));
回复 使用道具 举报
jiangshicun007 发表于 2015-12-4 18:42
String str1 = "ijsfajk";
                String str2 = "qhsfqal";
                String str = "";

主要是考察你对双重循环的掌握程度
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马