【问题标题】:Diagonal difference对角线差
【发布时间】:2017-10-13 07:14:22
【问题描述】:

我是编程初学者,我在编写对角线差时想出了这种方法,

 public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    int j = 0;
    int a[][] = new int[n][n];
    int count1 = 0; int count2 = 0;
    int result = 0;
    for(int a_i=0; a_i < n; a_i++){
        for(int a_j = 0;a_j < n;a_j++){
       
            a[a_i][j] = in.nextInt();
        
    }}
    for(int i = 0;i<n;i++)
    {
        count1+=a[i][j];
        System.out.println(count1);
        j++;
    }
    j = 0;
    for(int i = n-1;i>=0;i--)
    {
        count2+=a[i][j];
        System.out.println(count2);
        j++;
    }
    result = Math.abs(count1 - count2);
    System.out.println(result);
}

输入
3
11 2 4
4 5 6
10 8 -12

预期输出 15
我的输出 16

【问题讨论】:

  • 在您的第一个循环中,您使用的是 j 而不是 a_j。不确定这是否是故意的,但这是我注意到的。
  • 请注意,重用变量(就像您使用 j 一样)通常是一个坏主意,如此处所示。在尽可能严格的范围中声明变量;声明一个变量没有内在成本。您可以在 for 循环中声明(和更新)多个变量(前提是它们属于同一类型),因此 for (int i = 0, j = 0; i&lt;n; i++, j++) 更适合您的第二个循环(或仅使用 i 代替 j,因为它们是相等),for(int i = n-1, j=0;i&gt;=0;i--, j++) 用于第三个循环。 (请记住从正文中删除j++)。
  • @Flaom 感谢您的指出。
  • @AndyTurner 我肯定会记住这一点。非常感谢!

标签: java arrays for-loop


【解决方案1】:

为什么这么多变通? 你需要一个非常简单的代码:

for(int i = 0;i<n;i++){
    count1+=a[i][i];
    count2+=a[i][n-1-i];
}

【讨论】:

    【解决方案2】:

    只是为了发展弗兰克的回答,您实际上并不需要数组:

    for(int i=0; i < n; i++){
      for(int j = 0; j < n; j++){
        int v = in.nextInt();
        count1 += (i == j) ? v : 0;
        count2 += (i + j == n-1) ? v : 0;
      }
    }
    

    【讨论】:

      【解决方案3】:

      在java中解决方案是

          int result = 0;
          for(int i = 0;i<n;i++){
              l+=a[i][i];
              r+=a[i][n-1-i];
          }
          result = abs(l-r);
      

      对于那些想在 python 中做同样事情的人来说,这里是如何做的:

      def diagonalDifference(a):
          l = sum(a[i][i] for i in range(len(a)))
          r = sum(a[i][len(a)-1-i] for i in range(len(a)))
          return (abs(r- l))
      

      【讨论】:

      • 虽然这不是很多代码,但我发现这令人难以置信的不可读
      • 如果不是代码,那它会是什么? l 代表左,r 代表右 r+= 表示 r =r+。这只是一种创建短代码兄弟的方法。一旦 u right a[i][i] 它可以帮助你到达对角线左侧。这里的诀窍是在 a[i][n-1-i] 中,它允许您从另一侧到达对角线。我希望它现在更容易理解。如果您需要任何解释,请随时询问:)。
      【解决方案4】:

      这里是 Javascript。我使用 forEach 是为了提高可读性。你可以在 Java 中非常相似地做到这一点。

      function diagonalDifference(arr) {
          let length = arr.length-1;
          let leftDiag = 0;
          let rightDiag = 0;
      
      
          arr.forEach((item, outerIndex) => {
              item.forEach((innerItem, innerIndex) => {
                  if (outerIndex === innerIndex) {
                      leftDiag = leftDiag + innerItem;
                  }
                  if (length - outerIndex === innerIndex) {
                      rightDiag = rightDiag + innerItem;
                  }
              });
          });
      
          return Math.abs(leftDiag - rightDiag);
      
      }
      

      【讨论】:

        【解决方案5】:

        我在 Java 中的对角差分 Hackerrank 解决方案。

        public static int diagonalDifference(List<List<Integer>> arr) {
            int primaryDiagnal = 0;
            int secDiagnal = 0;
            int diff;
        
            for(int i= 0; i<arr.get(0).size(); i++){
                primaryDiagnal += arr.get(i).get(i);
            }
        
            int col = arr.get(0).size() - 1;
            for(int i= 0; i<arr.get(0).size(); i++){
                secDiagnal += arr.get(i).get(col);
                col--;
            }
        
            diff = primaryDiagnal - secDiagnal;
            return Math.abs(diff);
         }
        

        【讨论】:

          【解决方案6】:
          public static int diagonalDifference(List<List<Integer>> arr) {
              
              ListIterator<List<Integer>> itr = arr.listIterator();
              int i = 0,k=arr.size();
              int sumdia1=0 , sumdia2=0;
              List <Integer> inner;
              System.out.println(" k ::: "+k);
              while(itr.hasNext()) {
                       inner = itr.next();
                       k--;
                      sumdia1= sumdia1 + inner.get(i);
                      sumdia2= sumdia2+ inner.get(k);
                      i++;
                  
              }
          

          【讨论】:

          • 您能解释一下为什么这是解决问题的方法吗?欢迎对此答案进行编辑。
          【解决方案7】:
          public static int diagonalDifference(List<List<Integer>> arr) {
          
              int leftSum=0, rightSum=0;
              int i=-1;
              List <Integer> inner;
              Iterator<List<Integer>> list = arr.iterator();
              while (list.hasNext()){
                  inner=list.next();
                  i++;
                  leftSum += inner.get(i);
                  rightSum += inner.get(inner.size()-1-i);           
                      
              }
          
              return Math.abs(leftSum-rightSum); 
          
          }
          

          【讨论】:

          • 请在您的答案中添加解释。
          【解决方案8】:

          您可以采用 size/2 遍历方法。这可能看起来令人生畏,但一旦你了解了你就会爱上它的光彩。

          int i=arr.Count/2,j=i,sum=0;
                  if(arr.Count%2 != 0){
                     i--;
                     j++; 
                  }else{
                      i--;
                  }
                  for(;i>=0;i--,j++){
                  sum += arr[i].ElementAt(i)+arr[j].ElementAt(j)-arr[i].ElementAt(j)-arr[j].ElementAt(i);
                  }
                  return Math.Abs(sum); 
          

          【讨论】:

            【解决方案9】:
            int k=0;
            int l=0;
            int m;
            int z=arr.length;
            int s=arr.length-1;
            for(int i=0;i<z;i++) {
                for(int j=0;j<z;j++) {
                    if(i==j){
                        k=k+arr[i][j];
                    }
                }
                l=l+arr[i][s];   
                s--;
            }
            if(l>k) {
                m=l-k;
            } else {
                m=k-l;
            }
            return m;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2022-09-25
              • 2017-02-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-08-13
              • 1970-01-01
              • 2018-06-20
              相关资源
              最近更新 更多