数量成对交换的第三大和最小数字

时间:2016-08-27 06:57:03

标签: java random

这是查找第3个和第3个最小数字的代码。

t =没有测试用例

num =用户输入号码

如果num是单个数字,则无法打印。

如果num是123,那么它应该存储123,132,213,231,312,321。

其中,前面的第3个是213,后面是231个。

我的代码问题是当我输入

123它给出随机数112,211,133,311 ......等等。

我不想要。

我想要一个包含1,2和3的3位数字。

如果数字是1234,它应该有4321,2134,3124 ...... 1143,2211。

问题方法是solve(int num)。 在这个方法中,我已经将整数num转换为字符串num,然后将其存储在字符串树集中,我将再次将其转换为整数树集,以便找到第3个最大和第3个最小数字。

我不确定primefact方法(它给出了因子{数字的长度)是否有用......

public class ThirdSmallestLargest {
public static void main(String[] args) {
    Scanner in=new Scanner(System.in);
    ThirdSmallestLargest tsl=new ThirdSmallestLargest();
    int t,num;
    t=in.nextInt();
    while(t!=0){
        num=in.nextInt();
        tsl.match(num);
        t--;
    }
}
//---------------------Method for finding zero in a number
private void match(int num) {
    int length=(int) (Math.log10(num)+ 1);
    if(length==1){
        System.out.println("Not possible");
    }
    else{
           String s = String.valueOf(num);
           if (s.indexOf('0')<0){
               solve(num);
           }  
    }
}  
//---------------------method for distinct jumble number
 //NOT DONE CONVERT STRING TREESET TO INTEGER TREESET
private void solve(int num) {
        int length=(int) (Math.log10(num)+ 1);
       TreeSet <String> tsstr=new TreeSet<>();
       Iterator<String> itr=tsstr.iterator();
       //Integer.toString(num);
       char[] chars = Integer.toString(num).toCharArray();
      StringBuilder sb = new StringBuilder(); // doesnt work with 666,7979 types of number
       Random random =  new Random();  
       while (tsstr.size() <fact(num)){
       for (int i = 0; i < length; i++) {                                 
       char c = chars[random.nextInt(chars.length)];
           sb.append(c);

        }           
        String output = sb.toString();
        sb.setLength(0);//set the length of the char

       // String input=sb.toString();
        //System.out.println(output);
       // if(output.contentEquals("1"))
      // tsstr.add(Integer.toString(num));

        tsstr.add(output);   
    }
       System.out.println(tsstr);


}

private int fact(int num) {
    int length=(int) (Math.log10(num)+ 1);
    int i,fact=1;
    for(i=1;i<=length;i++){
       fact=fact*i;
    }
    return fact;
 }
}

2 个答案:

答案 0 :(得分:2)

首先,排序数字。

我们说排序后输入为111222333444。这是最低号码。

通过将34进行交换,即111222334344,找到下一个号码。换句话说,您将最后一个第二高的数字位置向右移动。这是第二低的号码。

现在有两种情况:

  • 如果有一个以上的最高位(4),只需再次,即将最后一个3向右移动:111222334434
  • 如果只有一个4,则3即将结束且无法向右移动,例如11122233341112223343,我们将其移回,然后向右移动最后一个第三高位(2)一个位置:111222334311122233341112232334

您现在已找到第三低号码。回顾一下:
111222333444111222334344 111222334434
11122233341112223343 1112232334

您可以跳过中间步骤。如果有多个4,则向前移动3两个位置。否则,将最后2个位置向右移动。

对于第三高的号码,你会做同样的事情,除了逆转:
444333222111444333221121 (最后2向右移动两个位置)
44433322214443323221 (最后3向右移动一个位置)

我会留给你写代码。

答案 1 :(得分:1)

一些建议让你前进:

  1. 将您的代码分成您需要的不同“功能”,例如:创建所有可能的数字组合的排列
  2. 让他们排序
  3. 换句话说:首先创建所有可能数字的列表;然后简单地使用多种方法之一来获取该列表;然后你就决定了那些排序列表中的哪些“索引”对你来说是直接的。

    并且:分别选择更好的抽象:不要将“跳跃”从一个级别移动到另一个级别。坚持下去。

    含义:最初,将您的用户输入视为字符串,而不是数字(当然,您必须检查此字符串是否只包含数字)。

    你看,如果你有一个字符串,你可以直接询问它的长度;无需调用log()来计算字符串中的字符数。然后,您可以轻松地从字符串中获取单个数字 - 并获得一个字符数组。现在,您可以轻松创建这些字符的排列;建立字符串。最后,将所有字符串转换为整数以进行排序。

    但重点是:上述所有步骤都应该是他们自己独特的功能。构建小方法(所有这些方法都非常适合自己进行测试)......然后从中构建解决方案。