none
如何使不符合要求的元素等于离它最近的一个元素? RRS feed

  • 问题

  • 假设有一组字符串数组{"0","0","1","2","3",“0”,"4","0","0"},如何查找使0等于离它最近的且不为0的元素,如果离它最近的不为0的元素有两个,则等于上一个元素,即想得到重新赋值后这样的数组{"1","1","1","2","3",“3”,"4","4","4"}。请教高手,这个算法该怎么写合适?谢谢!

    努力~

    2013年8月5日 12:52

答案

  • 没有考虑到数组的变化,通过建立两个数组就没有问题了。按照我之前说的那个逻辑,代码看起来还是要稍微清晰一点。

    修改后的代码如下:

    string[] s = new string[9] { "0", "0", "1", "2", "0", "0", "4", "0", "0" };
                string[] result = new string[9];
                for (int i = 0; i < s.Length; i++)
                {
                    Console.WriteLine("=="+s[i]+"==");
    
                    if (s[i] != "0")
                    {
                        result[i] = s[i];
                        continue;
                    }
                        
                    for (int j = 1; j < s.Length; j++)
                    {
                        if (i - j >= 0)
                        {
                            if (s[i - j] != "0")
                            {
                                result[i] = s[i - j];
                                break;
                            }
                        }
                        if (i + j < s.Length)
                        {
                            if (s[i + j] != "0")
                            {
                                result[i] = s[i + j];
                                break;
                            }
                        }
                    }
                }
    
                for (int i = 0; i < result.Length; i++)
                {
                    Console.WriteLine(result[i]);
                }
     

    谢谢Learning hard的批评指正。

    思路非常清晰,最后测试也是正确的,好像思路中第二点应该是书写错误吧,应该是:

    如果是的话跳过,如果不是的话(指的不是0)将数组内的当前值替换为此值


    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample

    • 已标记为答案 zjyh16 2013年8月6日 11:25
    2013年8月6日 9:23
  • 没有考虑到数组的变化,通过建立两个数组就没有问题了。按照我之前说的那个逻辑,代码看起来还是要稍微清晰一点。

    修改后的代码如下:

    string[] s = new string[9] { "0", "0", "1", "2", "0", "0", "4", "0", "0" };
                string[] result = new string[9];
                for (int i = 0; i < s.Length; i++)
                {
                    Console.WriteLine("=="+s[i]+"==");
    
                    if (s[i] != "0")
                    {
                        result[i] = s[i];
                        continue;
                    }
                        
                    for (int j = 1; j < s.Length; j++)
                    {
                        if (i - j >= 0)
                        {
                            if (s[i - j] != "0")
                            {
                                result[i] = s[i - j];
                                break;
                            }
                        }
                        if (i + j < s.Length)
                        {
                            if (s[i + j] != "0")
                            {
                                result[i] = s[i + j];
                                break;
                            }
                        }
                    }
                }
    
                for (int i = 0; i < result.Length; i++)
                {
                    Console.WriteLine(result[i]);
                }
     

    谢谢Learning hard的批评指正。

    • 已建议为答案 Learning hard 2013年8月6日 9:23
    • 已标记为答案 zjyh16 2013年8月6日 11:25
    2013年8月6日 9:03
    版主

全部回复

  • 自己试了一下,这样好像是可以了,有没有更好的方法呢?

    如下:

    string[] s=new String[9]{"0","0","1","2","3","0","4","0","0"};
    
    for (int i = 0; i < s.Length; i++)
    {
    	if(i <s.Length-1)
    	{
    		if (s[i]!="0")
    		{
    			if (s[i+1]=="0")
    			{
    				s[i+1]=s[i];
    			}
    		}
    		else
    		{
    			for (int j = i+1; j < s.Length; j++)
    			{
    				if (s[j]!="0")
    				{
    					s[i]=s[j];
    					break;
    				}
    			}
    		}
    	}
    }
    for (int i = 0; i < s.Length; i++) 
    {
    	Console.WriteLine(s[i]);
    }
    Console.ReadLine();


    努力~

    2013年8月5日 13:23
  • 自己试了一下,这样好像是可以了,有没有更好的方法呢?

    如下:

    string[] s=new String[9]{"0","0","1","2","3","0","4","0","0"};
    
    for (int i = 0; i < s.Length; i++)
    {
    	if(i <s.Length-1)
    	{
    		if (s[i]!="0")
    		{
    			if (s[i+1]=="0")
    			{
    				s[i+1]=s[i];
    			}
    		}
    		else
    		{
    			for (int j = i+1; j < s.Length; j++)
    			{
    				if (s[j]!="0")
    				{
    					s[i]=s[j];
    					break;
    				}
    			}
    		}
    	}
    }
    for (int i = 0; i < s.Length; i++) 
    {
    	Console.WriteLine(s[i]);
    }
    Console.ReadLine();


    努力~

    经过自己再次测试发现这个算法有时不对,还是求高手帮忙。

    努力~

    2013年8月5日 14:05
  • 你好,

    欢迎来到MSDN中文论坛。

    我有一段逻辑代码,经过测试应该是可以满足你的需求的,现在贴出来供你参考:

    string[] s = new String[9] { "1", "0", "0", "0", "0", "0", "0", "0", "0" };
                for (int i = 0; i < s.Length; i++)
                {
                    if (s[i] != "0")
                        continue;
                    for (int j = 1; j < s.Length; j++)
                    {
                        if (i - j >= 0)
                        {
                            if (s[i - j] != "0")
                            {
                                s[i] = s[i - j];
                                break;
                            }
                        }
                        if (i + j < s.Length)
                        {
                            if (s[i + j] != "0")
                            {
                                s[i] = s[i + j];
                                break;
                            }
                        }
                    }
                }
    
                for (int i = 0; i < s.Length; i++)
                {
                    Console.WriteLine(s[i]);
                }
                Console.ReadLine();

    代码的逻辑是这样的:

    1. 首先对数组里面的数字进行一次遍历,如果当前的值不为“0”则跳过,否则对它进行处理。

    2. 处理不为“0”的值的时候,用一种“等距离比较”的方法,找出等距离内的左右2个值,优先看左边的值是否为“0”,如果不是的话跳过,如果是的话将数组内的当前值替换为此值。

    3. 距离(就是代码里面的j)的最大值为数组长度减去1,遍历的时候注意i-j的值不小于0,i+j的值要小于数组长度。

    希望可以帮到你。

    2013年8月6日 6:34
    版主
  •  string[] s = new String[9] { "0", "0", "1", "0", "0", "0", "4", "0", "3" };
                int i = 0;
                int k = 0;
                while (i < s.Length-1)
                {
                    if (s[i] != "0")
                    {
                        if (i > 0)
                        {
                            if (s[i - 1] == "0")
                            {
                                while (i > 0)
                                {
                                    if (s[i - 1] == "0")
                                    {
                                        s[i - 1] = s[i];
                                        i--;
                                    }
                                    else
                                    {
                                        break;
                                    }
                                }
                            }
                        }
                    }
                    else
                    {                   
                        if (i > 0)
                        {
                            if (s[i - 1] != "0" )
                            {
                                s[i] = s[i - 1];
                                // K 是计算连续0的个数
                                if (s[i + 1] == "0")
                                {
                                    k++;
                                }
                            }
    
                            if (s[i - 1] != "0" && s[i + 1] != "0"&& k>=1)
                            {
                                k = 0;
                                s[i] = s[i + 1];
                            }                        
                        }
                    }
    
                    i++;
                }
                if (i == s.Length-1&&s[i]=="0")
                {
                    
                    s[i] = s[i - 1];
                }
    
                for (int j = 0; j < s.Length; j++)
                {
                    Console.WriteLine(s[j]);
                }
                Console.ReadLine();
    上面的代码我测试基本没问题的,你可以测试下

    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample

    2013年8月6日 6:48
  • 你好,

    欢迎来到MSDN中文论坛。

    我有一段逻辑代码,经过测试应该是可以满足你的需求的,现在贴出来供你参考:

    string[] s = new String[9] { "1", "0", "0", "0", "0", "0", "0", "0", "0" };
                for (int i = 0; i < s.Length; i++)
                {
                    if (s[i] != "0")
                        continue;
                    for (int j = 1; j < s.Length; j++)
                    {
                        if (i - j >= 0)
                        {
                            if (s[i - j] != "0")
                            {
                                s[i] = s[i - j];
                                break;
                            }
                        }
                        if (i + j < s.Length)
                        {
                            if (s[i + j] != "0")
                            {
                                s[i] = s[i + j];
                                break;
                            }
                        }
                    }
                }
    
                for (int i = 0; i < s.Length; i++)
                {
                    Console.WriteLine(s[i]);
                }
                Console.ReadLine();

    代码的逻辑是这样的:

    1. 首先对数组里面的数字进行一次遍历,如果当前的值不为“0”则跳过,否则对它进行处理。

    2. 处理不为“0”的值的时候,用一种“等距离比较”的方法,找出等距离内的左右2个值,优先看左边的值是否为“0”,如果不是的话跳过,如果是的话将数组内的当前值替换为此值。

    3. 距离(就是代码里面的j)的最大值为数组长度减去1,遍历的时候注意i-j的值不小于0,i+j的值要小于数组长度。

    希望可以帮到你。

    你的代码我测试的时候还是不可以的,出现的问题还是和楼主的问题一样的,例如,"0", "0", "1", "2", "0", "0", "4", "0", "0"这样一组字符串应该结果为: "1", "1", "1", "2", "2", "4", "4", "4", "4",但是你上面的代码和楼主结果是一样的,是:1,1,1,2,2,2,4,4,4。

    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample

    2013年8月6日 6:53
  • 没有考虑到数组的变化,通过建立两个数组就没有问题了。按照我之前说的那个逻辑,代码看起来还是要稍微清晰一点。

    修改后的代码如下:

    string[] s = new string[9] { "0", "0", "1", "2", "0", "0", "4", "0", "0" };
                string[] result = new string[9];
                for (int i = 0; i < s.Length; i++)
                {
                    Console.WriteLine("=="+s[i]+"==");
    
                    if (s[i] != "0")
                    {
                        result[i] = s[i];
                        continue;
                    }
                        
                    for (int j = 1; j < s.Length; j++)
                    {
                        if (i - j >= 0)
                        {
                            if (s[i - j] != "0")
                            {
                                result[i] = s[i - j];
                                break;
                            }
                        }
                        if (i + j < s.Length)
                        {
                            if (s[i + j] != "0")
                            {
                                result[i] = s[i + j];
                                break;
                            }
                        }
                    }
                }
    
                for (int i = 0; i < result.Length; i++)
                {
                    Console.WriteLine(result[i]);
                }
     

    谢谢Learning hard的批评指正。

    • 已建议为答案 Learning hard 2013年8月6日 9:23
    • 已标记为答案 zjyh16 2013年8月6日 11:25
    2013年8月6日 9:03
    版主
  • 没有考虑到数组的变化,通过建立两个数组就没有问题了。按照我之前说的那个逻辑,代码看起来还是要稍微清晰一点。

    修改后的代码如下:

    string[] s = new string[9] { "0", "0", "1", "2", "0", "0", "4", "0", "0" };
                string[] result = new string[9];
                for (int i = 0; i < s.Length; i++)
                {
                    Console.WriteLine("=="+s[i]+"==");
    
                    if (s[i] != "0")
                    {
                        result[i] = s[i];
                        continue;
                    }
                        
                    for (int j = 1; j < s.Length; j++)
                    {
                        if (i - j >= 0)
                        {
                            if (s[i - j] != "0")
                            {
                                result[i] = s[i - j];
                                break;
                            }
                        }
                        if (i + j < s.Length)
                        {
                            if (s[i + j] != "0")
                            {
                                result[i] = s[i + j];
                                break;
                            }
                        }
                    }
                }
    
                for (int i = 0; i < result.Length; i++)
                {
                    Console.WriteLine(result[i]);
                }
     

    谢谢Learning hard的批评指正。

    思路非常清晰,最后测试也是正确的,好像思路中第二点应该是书写错误吧,应该是:

    如果是的话跳过,如果不是的话(指的不是0)将数组内的当前值替换为此值


    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample

    • 已标记为答案 zjyh16 2013年8月6日 11:25
    2013年8月6日 9:23
  • 没错的,就是这个意思。描述不当还请见谅。

    2013年8月6日 9:34
    版主