在不使用数组或任何使用数组或任何其他集合的函数的情况下,查找用户给出的 n 个值的中位数

Find the median of n values given by the user without using arrays or any function that uses arrays or any other collection

只允许对变量进行手动算法。不使用列表、数组等集合。 (我在程序中使用了 .length() 函数,但可以通过在每次输入后放置 space 并计算字符数直到找到 space 来手动完成)

使用数组可以解决的问题是存储用户输入的任意数量的值。这可以通过将值存储在字符串中来解决。因为我们必须知道从字符串中选择多少个字符来组成一个数字,所以我还将数字的长度存储在一个单独的字符串中(长度通常只有一位数字,所以我们可以肯定地知道第 n 个数字的长度将位于 lengthstorage 字符串中的第 n 个字符。)

算法:

  1. 从字符串中取出一个数字,然后从字符串中的每个其他数字中减去它。
  2. 如果结果为正,则对整数加1'pos';如果为负,则 'neg';如果为零,则为 'copy'。
  3. 如果输入奇数个数,则pos + copy >= n/2且neg + copy >= n/2的数为中位数。
  4. 如果输入偶数个数字,那么我们将有 2 个中间数字 fmedian 和 smedian,它们的平均值就是中位数。 (算法参考代码)


import java.util.Scanner;
class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String input,inputstorage,lengthstorage,inputlength;
    int nonrep=0;
    System.out.println("Enter the number of values");
    int n = sc.nextInt();
    int fmedian=0,smedian=0;
    System.out.println("Enter a value");
    input= sc.next();                                                                 //String
    inputlength = "" + (char)(input.length()+48);
    inputstorage = input;
    lengthstorage = inputlength;
    for (int i=1; i<n; i++)
    {
        System.out.println("Enter a value");
        input = sc.next(); 
        inputstorage = inputstorage + input;
        lengthstorage = lengthstorage + (char)(input.length()+48); 
    }                

    int mainnumpos = 0;

    for(int j=0;j<n;j++)
    {
      int copy=0;
      int mainnumlength = lengthstorage.charAt(j) - 48;
        int neg=0,pos=0;
        int mainnum = 0; int factor = 1;int mainnumsign = 0;
        for (int m =mainnumlength-1; m >= 0; m--)
        {
        if(inputstorage.charAt(mainnumpos+m)=='-')
        {
          mainnumsign = 1;
        }
        else
        {
        mainnum += (inputstorage.charAt(mainnumpos+m) - '0') * factor;
        factor *= 10;
        }
        }
        mainnumpos = mainnumpos + mainnumlength;
        if(mainnumsign==1)
        {
          mainnum = -mainnum;
        }

        int position = 0;
        for (int q=0;q<n;q++)

      { int fnumsign = 0;


      int fnumlength = lengthstorage.charAt(q) - 48;

        int fnum = 0;
        factor = 1;
        for (int l =fnumlength-1; l >= 0; l--)
        {
          if(inputstorage.charAt(position+l)=='-')
          {
            fnumsign = 1;
          }
          else{
        fnum += (inputstorage.charAt(position+l) - '0') * factor;
        factor *= 10;
          }
        }
        if(fnumsign==1)
        {
          fnum = -fnum;
        }
        if((mainnum-fnum)>0)
        {
          pos++;
        }
        else if((mainnum-fnum)<0)
        {
          neg++;
        }
        else{
          copy++;
            }
        position = position + fnumlength;



      }

      if((n%2)!=0){

     if((double)(pos+copy)>=((double)n)/2.0 && (double)(neg+copy)>=((double)n)/2.0)
     {
       if(nonrep==0)
       {
       System.out.println("The median is: "+ mainnum);
       nonrep++;
       }                           
     }
     }
     else
     {
       if ((double)(pos+copy)==(double)n/2.0) 
       {
         fmedian=mainnum;
       }
       else if((double)(neg+copy)==(double)n/2.0) 
       {
         smedian = mainnum;
       }
       else if((double)(pos+copy)>=(double)n/2.0 && (double)(neg+copy)>=(double)n/2.0  ) 
       {
         fmedian = mainnum;
         smedian = mainnum;
       }
       if(j==n-1){
         double evenmedian = ((double)(smedian + fmedian))/2.0;
       System.out.println("The median is: "+evenmedian);
       }
     }
    }

  }
}