这是查找第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;
}
}
答案 0 :(得分:2)
首先,排序数字。
我们说排序后输入为111222333444
。这是最低号码。
通过将3
与4
进行交换,即111222334344
,找到下一个号码。换句话说,您将最后一个第二高的数字位置向右移动。这是第二低的号码。
现在有两种情况:
4
),只需再次,即将最后一个3
向右移动:111222334434
。4
,则3
即将结束且无法向右移动,例如1112223334
→1112223343
,我们将其移回,然后向右移动最后一个第三高位(2
)一个位置:1112223343
→1112223334
→1112232334
您现在已找到第三低号码。回顾一下:
111222333444
→111222334344
→ 111222334434
1112223334
→1112223343
→ 1112232334
您可以跳过中间步骤。如果有多个4
,则向前移动3
两个位置。否则,将最后2
个位置向右移动。
对于第三高的号码,你会做同样的事情,除了逆转:
444333222111
→444333221121
(最后2
向右移动两个位置)
4443332221
→4443323221
(最后3
向右移动一个位置)
我会留给你写代码。
答案 1 :(得分:1)
一些建议让你前进:
换句话说:首先创建所有可能数字的列表;然后简单地使用多种方法之一来获取该列表;然后你就决定了那些排序列表中的哪些“索引”对你来说是直接的。
并且:分别选择更好的抽象:不要将“跳跃”从一个级别移动到另一个级别。坚持下去。
含义:最初,将您的用户输入视为字符串,而不是数字(当然,您必须检查此字符串是否只包含数字)。
你看,如果你有一个字符串,你可以直接询问它的长度;无需调用log()来计算字符串中的字符数。然后,您可以轻松地从字符串中获取单个数字 - 并获得一个字符数组。现在,您可以轻松创建这些字符的排列;建立字符串。最后,将所有字符串转换为整数以进行排序。
但重点是:上述所有步骤都应该是他们自己独特的功能。构建小方法(所有这些方法都非常适合自己进行测试)......然后从中构建解决方案。