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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

获取两个字符串的最大公约数,比如 ijsfajk  和  qhsfqal 两个字符串的最大公约数为sf。  坐等大神支招

32 个回复

正序浏览
jiangshicun007 发表于 2015-12-4 18:42
String str1 = "ijsfajk";
                String str2 = "qhsfqal";
                String str = "";

主要是考察你对双重循环的掌握程度
回复 使用道具 举报
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)));
回复 使用道具 举报
乌鲁特 来自手机 中级黑马 2015-12-4 12:47:59
31#
哎,看书去了,T^T
回复 使用道具 举报
找出字符串最小的那个定义成min最大的定义成max,然后对min进行截取,与max进行比较,直到相同就为最大公约数,
回复 使用道具 举报
星晴。 来自手机 中级黑马 2015-12-4 12:02:24
29#
这个题目不错,记住了
回复 使用道具 举报
sun4w 中级黑马 2015-12-4 09:21:31
28#
这个很厉害 要学习一下 哈哈
回复 使用道具 举报
来顶一下
回复 使用道具 举报
好多大神啊
回复 使用道具 举报
看着很难。。。。
回复 使用道具 举报
一道想不出来不影响很大吧
回复 使用道具 举报
好吧 看来自己真的得在多努力了
回复 使用道具 举报
受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;
                        }
                }
        }
}
回复 使用道具 举报
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. }
复制代码


回复 使用道具 举报
要是在面试中,有时间限制,再加上气氛的不同,怕一下想不到。
回复 使用道具 举报
零尘 发表于 2015-12-2 19:05
补充:如果这两个字符串假如是:
aabbcc
adbdc

bug找到的不错,受教了
回复 使用道具 举报
补充:如果这两个字符串假如是:
aabbcc
adbdc
那么最大的相同子字符串是三个:
a,b,c
所以建议用集合接收子字符串,然后根据长度排序.取出和最后一个相同长度(包括最后一个元素)的元素.打印
回复 使用道具 举报
受上边两位的启发做出来的,不同的地方是使用的数组和索引

package cn.itcast_01;

/*
* 思路:
*                 A:将小串转换成char数组
*                 B:使用String构造方法构造子串(最大公约数)(可以使用长度参数来构造子字符串)
*                 C:在大串中查找子串的索引
*                 D:不存在,索引返回-1,存在返回真实索引
* 最大公约数:opfhapio
*/
public class FuxiDemo {

        public static void main(String[] args) {
                String maxStr = "dhfsdhifaospdifahfsdiopfhapiod";
                String minStr = "sdhfopfhapioas";
                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;
                }
               
                char[] chs = minS.toCharArray();
               
                other:
                // 第一个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) {
                                        System.out.println(temp);
                                        break other;
                                }
                        }
                }

        }
}
回复 使用道具 举报
这是我的代码,与楼上的解决思路略有不同:
  1. //获取两个字符串的最大公约数,比如 ijsfajk 和 qhsfqal 两个字符串的最大公约数为sf
  2. /*
  3.   思路:1.循环遍历两个字符串中的各个字符,判断相等的字符;
  4.         2.如果两个字符相等,则判断该字符在对应字符串中位置之后的字符是否相等,
  5.                   如果是,将相等的部分连接在一起组成新的字符串存储起来;
  6.                 3.再次回到循环,将新生成的子串同之前获取的子串的长度进行比较,选择较长的存储。
  7.                 4.循环完毕,将最终的子串返回,即为最大公约数。
  8. */
  9. import java.lang.*;
  10. public class Demo{
  11.         public static void main(String[] args){
  12.                 String arr1 = "abcdefg";
  13.                 String arr2 = "yuabchdef";
  14.                 String max = maxString(arr1,arr2);
  15.                 System.out.println(max);
  16.         }
  17.         public static String maxString(String a,String b){
  18.                 String temp = "";    //临时存储所获取的子串
  19.                 String tem = "";     //存储当前最大长度的子串
  20.                 //双重for循环遍历两个字符串中的各个字符
  21.                 for(int i = 0;i<a.length();i++){
  22.                         for(int j = 0;j<b.length();j++){
  23.                         int m = i;
  24.                         int n = j;
  25.                         //判断第一个字符是否相等
  26.                         if(a.charAt(m)==b.charAt(n)){
  27.                                 temp = a.charAt(m)+"";
  28.                                 //第一个字符相等时,判断之后的字符是否相等
  29.                                 while(++m<a.length() && ++n<b.length()){
  30.                                 if(a.charAt(m)==b.charAt(n)){
  31.                                         temp += a.charAt(m);
  32.                                 }
  33.                                 }
  34.                                 //和之前获取的子串长度相比较,获取长度大的子串
  35.                                 if(temp.length()>tem.length())
  36.                                         tem = temp;

  37.                         }
  38.                 }
  39.                 }
  40.                 return tem;
  41.         }
  42.        
  43. }
复制代码
回复 使用道具 举报

想问,如果我把那两个jj分开,为什么会只打印s,这样是不是说最大公约数就是s了?这不科学啊。我还是不太明白这里的最大公约数怎么定义,不是数学里的那么明确,求指教
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马