当前位置: 首页 > news >正文

[C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素

一、问题描述

今天在MSDN论坛中看到这样的一个问题,觉得非常锻炼思维能力,所以这里记录下来作为备份,题目的要求是这样的:

假设有一组字符串数组{"0","0","1","2","3",“0”,"4","0","0"},如何查找使0等于离它最近的且不为0的元素,如果离它最近的不为0的元素有两个,则等于上一个元素,即想得到重新赋值后这样的数组{"1","1","1","2","3",“3”,"4","4","4"}

二、实现思路

这里的实现思路摘自论坛中 zjyh16的回复,实现思路为:

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

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

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

具体实现代码为:

string[] s = new String[9] { "0", "0", "1", "0", "0", "0", "4", "0", "3" };
            string[] result = new string[9];
            for (int i = 0; i < s.Length; i++)
            {
                if (s[i] != "0")
                {
                    result[i] = s[i];
                    continue;
                }
                // j是距离,初始化距离为1
                for (int j = 1; j < s.Length; j++)
                {           
                    if (i - j >= 0)
                    {
                        // 左边距离为j的元素不等于0时
                        if (s[i - j] != "0")
                        {
                            result[i] = s[i - j];
                            break;
                        }
                    }
                    if (i + j < s.Length)
                    {
                        // 右边距离为j的元素不等于0时
                        if (s[i + j] != "0")
                        {
                            result[i] = s[i + j];
                            break;
                        }
                    }
                }
            }
            for (int i = 0; i < result.Length; i++)
            {
                Console.WriteLine(result[i]);
            }
               
            Console.ReadLine();

三、运行结果

06173644-9f904dc0927f4904844e6411002bb438.jpg


相关文章:

  • c#本质论吐槽体、鸡血体
  • ×××拨号成功后,同时可以本地上网的网络信息摘要
  • SPFA算法学习笔记
  • Struts 2 的Action详解(一)
  • 也看二代身份证的安全问题
  • Scrum理论
  • HTTP RANGE(多线程下载相关)
  • IOS用正则表达式验证textfield输入的内容是否合法
  • ora-01207错误处理
  • 就这么开始了
  • MySQL 子查询(subquery)语法与用法实例
  • Android 蓝牙开发(整理大全)
  • Openerp js代码分析 继承部分
  • php全面获取url地址栏及各种参数
  • poj2679
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【EOS】Cleos基础
  • 0基础学习移动端适配
  • Apache Zeppelin在Apache Trafodion上的可视化
  • CSS3 变换
  • css属性的继承、初识值、计算值、当前值、应用值
  • ES6系统学习----从Apollo Client看解构赋值
  • Hibernate最全面试题
  • HTTP 简介
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • JavaScript实现分页效果
  • Laravel 中的一个后期静态绑定
  • MySQL的数据类型
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • node-glob通配符
  • Spring Boot MyBatis配置多种数据库
  • 讲清楚之javascript作用域
  • 微信小程序开发问题汇总
  • 一些css基础学习笔记
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #图像处理
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • $ git push -u origin master 推送到远程库出错
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (4.10~4.16)
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (转)EXC_BREAKPOINT僵尸错误
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET Micro Framework初体验
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)