代码之家  ›  专栏  ›  技术社区  ›  ray

优化代码(如ruby中的代码),用于在C中用奇数位交换2个数字#

  •  3
  • ray  · 技术社区  · 5 年前

    我是ruby开发人员,在某些情况下,我需要交换两个数字中的奇数位 C# .

    a = 35321
    b = 123456
    a1, b1 = a.to_s.chars, b.to_s.chars # ['3', '5', '3'. '2', '1'], ['1', '2', '3', '4', '5', '6'] 
    
    n = [a1.length, b1.length].min - 1 # => 4
    

    以下面的方式交换,

    n.times do |i|
      if i.odd?
        temp = a1[i]
        a1[i] = b1[i]
        b1[i] = a1[i]
      end
    end  
    

    或优化代码低于使用 step

    1.step(n,2) { |i| a1[i], b1[i] = b1[i], a1[i] }
    

    最后我得到了预期的数字,

    > a = a1.join.to_i
    # => 32341 
    > b = b1.join.to_i
    # => 153256
    

    我的问题是我不知道如何才能在 C# 如果有人提供任何建议,我将不胜感激。

    0 回复  |  直到 5 年前
        1
  •  1
  •   er-sho    5 年前

    有很多方法 c# 为了得到你想要的结果,但是我给你一个你很容易理解的解决方案,

    c#

    int input1 = 35321;
    int input2 = 123456;
    
    int[] a = input1.ToString().Select(t => int.Parse(t.ToString())).ToArray();
    int[] b = input2.ToString().Select(t => int.Parse(t.ToString())).ToArray();
    

    然后我们使用传统的for循环在两个奇数索引数组之间交换数字

    for (int i = 0; i < a.Length; i++)    //<= Loop through on first array
    {
         if (i % 2 != 0)                  //<= Check for odd index
         {
              int q = a[i];               //<= Take element from first array with current index
              a[i] = b[i];                //<= Swap element from second array to first array on current index
              b[i] = q;                   //<= Swap element from first array to second array on current index
         }
    }
    

    然后我们只需通过,

    int number1 = Convert.ToInt32(string.Join("", a));
    int number2 = Convert.ToInt32(string.Join("", b));
    
    Console.WriteLine("Output for first array: \t" + number1);
    Console.WriteLine("Output for second array: \t" + number2);
    

    输出:

    enter image description here

    Demo

        2
  •  1
  •   Akshay Naik    5 年前

    考虑到输入a和b将是字符串。 下面的代码应该能得到你想要的结果。

    var result = string.Join("", b.ToString().Select((x, i) => (i % 2) == 0 || a.ToString().Length <= i ? x.ToString() : a.ToString().Substring(i, 1)));

    此代码将考虑长度差异。

    编辑 :还可以使用LINQ避免循环并将a和b视为数字来实现,如下所示。

    int[] ai = a.ToString().Select(x => int.Parse(x.ToString())).ToArray();
    int[] bi = b.ToString().Select(x => int.Parse(x.ToString())).ToArray();
    
    var number1 = string.Join("", bi.Select((x, i) => (i % 2) == 0 || ai.Count() <= i ? x.ToString() : ai[i].ToString()));
    var number2 = string.Join("", ai.Select((x, i) => (i % 2) == 0 || bi.Count() <= i ? x.ToString() : bi[i].ToString()));
    
    Console.WriteLine("Array 1:" + Convert.ToInt32(number1));
    Console.WriteLine("Array 2:" + Convert.ToInt32(number2));