Java“fractile”方法返回错误的输出

时间:2016-04-29 10:49:30

标签: java algorithm

路线: 给定int[] x和百分比p(0 - 100),找到y的最小值元素x,以便至少px元素小于或等于y

Example 1:
x = {-3, -5, 2, 1}, p = 50 
Method should return -3 
Reason: 50% of the elements in x are less than or equal to -3:  -5 and -3

Example 2:
x = {7, 9, 2, -10, -6}, p = 50 
Method should return 2 
Reason: 60 percent of the elements in x are less than or equal to 2: 2, -10 and -6 
-6 would be wrong because only 40% of the elements are less than or equal
(100% of the elements are less than or equal to 9, but that isn't the smallest value)

Example 3:
x = {1,2,3,4,5,6,7,8,9,1,2,3,4,5,7,9,5,43,124,94}, p = 0
Method should return 1
Reason: Only 0% is needed, so in theory any number will do, but 1 is the smallest value

这是我到目前为止为该方法编写的内容:

public static int fractile(int[] x, int p)
   {
      int smallestInt = x[0];            
      for (int i = 0; i < x.length; i++) {
         int testNum = x[i];
         int percentage;
         int count = 0;
         for (int j = 0; j < x.length; j++) {
            if (x[j] <= testNum)
               count++;
         }
         percentage = (count / x.length) * 100;
         if (testNum <= smallestInt && percentage >= p)
            smallestInt = testNum;
      }
      return smallestInt;
   }

但我的样本数字输出错误:

INPUT: 
[6, 5, 4, 8, 3, 2]
40%
Method returns: 6
INPUT: 
[7, 5, 6, 4, 3, 8, 7, 6, 9, 10]
20%
Method returns: 7
INPUT: 
[3, 4, 2, 6, 7, 5, 4, 4, 3, 2]
60%
Method returns: 3

这几乎就好像它抓住了第一个索引并没有看到它背后的数字,但我无法弄清楚为什么。

我做错了什么?

6 个答案:

答案 0 :(得分:3)

将您的百分比更改为double / float并将其中一个变量转换为double / float。

类似的东西:

double percentage=0.0;
...
percentage = ((double)count / x.length) * 100;

因此等式返回double / float。

-

  

原始类型的数字促销规则

     
      
  1. 如果两个值具有不同的数据类型,Java将自动将其中一个值提升为两种数据类型中较大的一种。

  2.   
  3. 如果其中一个值是整数而另一个是浮点值,Java会自动将积分值提升为   浮点值的数据类型。

  4.   
  5. 较小的数据类型,即byte,short和char,在与Java二进制算法一起使用时,首先被提升为int   运算符,即使两个操作数都不是int。

  6.   
  7. 在所有促销发生并且操作数具有相同的数据类型之后,结果值将具有与其相同的数据类型   推广操作数。
  8.   

作者:Jeanne Boyarsky&amp; Scott Selikoff - OCA学习指南

答案 1 :(得分:2)

在第

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{

String path=data.getData().getPath();
//Here insert the path into database
}

count和x.length都是整数。因此,除以它们会产生整数值,而不是浮点数。百分比可能包含0或100,而不是一些值。

答案 2 :(得分:1)

你需要的是选择算法,它以给定的比例对数组进行分区。

简单快速的是QuickSelect

我怀疑Java中有现成的实现,比如C ++ std::nth_element

答案 3 :(得分:1)

对于从最低到最高排序的数组,您只需将长度乘以百分比即可获得搜索元素的正确索引。有关更多信息Quantiles

会缩短你的代码

 public static int fractile(int[] x, double p){   
   Arrays.sort(x);       
   int k = (int) Math.ceil(x.length*p)-1;
   return x[k];
}

答案 4 :(得分:0)

你可以尝试:

public static int fractile( int[] x, int p )
   {
        Arrays.sort(x);
        return x[Math.max((int) Math.ceil(x.length / 100.0 * p) - 1, 0)];
   }

这假设您可以操作数组。对数组进行排序几乎总是使操作变得更容易。这将起作用,除非数组必须保持原样。

此代码对数组进行排序,因为初始输入&#39; p&#39;告诉您要查找的百分比,它会查看数组中的大致位置并返回存储在那里的值。

答案 5 :(得分:0)

我对该问题有另一种实现方式:

public static void main(String args[]){
		int[] a1 = {-3,-5,2,1};
		int[] a2 = {7,9,2,-10,-6};
		int[] a3 = {1,2,3,4,5,6,7,8,9,10};
		int[] a4 = {1,2,3,4,5,6,7,8,9,1,2,3,4,5,7,9,5,43,124,94};
		int[] a5 = {1};
		int p = 50;
		System.out.println(fractile(a1, p));
	}

	private static int fractile(int[] x, int p) {
		Arrays.sort(x);		
		double value0 = x.length / 100.0 * p;
		double value1 = Math.ceil(value0);
		int value2 = (int)value1; 
		int value3 = value2 - 1;
		int value4 = Math.max(value3, 0);
		return x[value4];
	}