HJ04_字符串分隔(8位补零)


前言

2023.02.11 感觉效率有点慢了,捂脸。昨天心情不好熬夜起晚了,然后上午主要是复习基础运算,与原码补码,还有进制转换。


一、字符串分隔

描述
•输入一个字符串,请按长度为8拆分每个输入字符串并进行输出;

•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
输入描述:
连续输入字符串(每个字符串长度小于等于100)

输出描述:
依次输出所有分割后的长度为8的新字符串

示例1
输入:
abc

输出:
abc00000

二、解题记录与分析

1.暴力解法

我真的走了好多弯路,substring 常看解析,但用得不多所以重载不熟,然后分了好多情况,其实不用分,想办法处理就行。
判空后情况分了大于等于8和小于8,大于等于8的就分能整除和不能整除,然后分情况处理,最后将新结果存在一个string字符串里面,遍历判空输出

我的弱点就是思维可以多多变通下,结合题目的已知条件,但是暴力算法不用完全放弃,因为最暴力的恰恰是最基础的,可以锻炼代码熟练能力。

然后这些算法看到我就有思路了,但是要把我思路完美转换成代码我还是走了弯路,不能立马写完,总之刷算法给了我很大感触。

看别的大佬们解题效率与那个精简的代码量,让我怀疑起来自己,是不是这行的都是脑子很活的,其他不想干的早都转行,只有我头铁进了C#后端行业,然后现在基础不好,疯狂恶补。
2023.02.12补充:复习时候发现之前写得有问题哇,是一两个小疏忽导致的,没想到阴差阳错过了,今天根据我的思路又优化了下,但是把我的想法变成代码还调试了好多次,熟练度不太够感觉

代码如下(示例):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StringSlic
{
    class Program
    {
        public static void Main()
        {
            #region
            string line = string.Empty;
            while ((line = System.Console.ReadLine()) != null)
            {
                // 注意 while 处理多个 case
                // 接到字符串算长度并除以8,得到商数,与余数
                // 测试用例1.hello world,2.abc 3. hello world yuan,4.abc
                line = line.Trim();
                if (string.IsNullOrWhiteSpace(line))
                {
                    return;
                }
                int len = line.Trim().Length;
                //System.Console.WriteLine("字符串长度为:" + len);
                int ShangShu = len / 8;
                //System.Console.WriteLine("除以8的结果:" + ShangShu);
                int YuShu = len % 8;
                //System.Console.WriteLine("对8取余的结果:" + YuShu);

                // 将目标字符按照8位分割后存储,长度为商数+1
                string[] NewLine = new string[ShangShu + 1];
                bool DaLing = false;
                // 大于8的情况
                for (int i = 0; i < NewLine.Length; i++)
                {
                    if (YuShu == 0)
                    {
                        // 以len=16举例,商2,商数+1=3
                        // 第三次循环时候 line为空,会报错,当line长度<=8时候肯定切完了
                        if (line.Length >= 8)
                        {
                            // 长度能整除8的
                            // 那么长度大于等于八,就是8的倍数,
                            // 一个数的倍数至少大于或等于它自身
                            // 没想到还复习了小学数学,笑死

                            // 直接切割赋值吧
                            // line.Substring(0, 8),对line从0开始,取8位字符,返回
                            // 8是长度不是下标,所以从0开始取下标0-7的字符,
                            // 不包含line[8]
                            NewLine[i] = line.Substring(0, 8).Trim();
                            // 同理line.Remove(0, 8)也是从0开始,移除8个字符
                            // 8是长度,不是下标,所以不包含line[8]
                            // 如hello world 返回rld
                            // 还有也可以用line.Substring(8)
                            line = line.Remove(0, 8);
                        }
                    }
                    else
                    {
                    // 余数不等于0的,又分为大于8和小于8
                        if (ShangShu == 0)
                        {
                            // 小于8,补8-字符长度个零
                            // 先把值存起来,NewLine.Length=1
                            NewLine[NewLine.Length - 1] = line;
                            // 补8-字符长度个零
                            int len1 = 8 - line.Length;
                            while (len1-- > 0)
                            {
                                NewLine[NewLine.Length - 1] += '0';
                            }
                        }
                        else
                        {
                            // 大于8,最后一个补零
                            // line.Substring(0, 8),对line从0开始,取8位字符,返回
                            // 8是长度不是下标,所以从0开始取下标0-7的字符,
                            // 不包含line[8]
                            if (line.Length > 8)
                            {
                                NewLine[i] = line.Substring(0, 8).Trim();
                                line = line.Remove(0, 8);
                            }
                            else
                            {
                                // 到这边的就是肯定把数字切得只剩余数了
                                // 为什么不用len,因为我发现len在Line变了的情况还是原来长度
                                // 先赋值,再补零
                                NewLine[NewLine.Length - 1] = line;
                                // 8-余数应该也行
                                int len1 = 8 - line.Length;
                                while (len1-- > 0)
                                {
                                    NewLine[NewLine.Length - 1] += '0';
                                }
                            }
                        }
                    }
                }

                foreach (string s in NewLine)
                {
                    if (!string.IsNullOrWhiteSpace(s))
                    {
                        //System.Console.WriteLine("切割后补零的结果为:" + s);
                        System.Console.WriteLine(s);
                    }
                }
            }

            #endregion

            #region             验证知识

            // int.Parse()和Convert.ToInt32()有什么不同
            //int[] s = new int[10];
            //s[0] = Convert.ToInt32(0.4); //0
            //s[1] = Convert.ToInt32(0.5); //0
            //s[2] = Convert.ToInt32(0.6); //1
             小于1时候直接传入小数,从传入的最后一位五舍六入
             小于1时候有运算舍掉小数
            //s[3] = Convert.ToInt32(7 / 8); //0
             大于1时候没懂
            //s[4] = Convert.ToInt32(4.5); //4
            //s[5] = Convert.ToInt32(5.5); //5
            //for (int i = 0; i < 10; i++)
            //{
            //    System.Console.WriteLine("下标:" + i + " 值:" + s[i]);
            //}
            //System.Console.ReadLine();

            #endregion
        }
    }
}

2.优化后解法

看了别人的首先知道了paleft(),padRight()两个方法,不亏,其次我居然木想到可以先补零再输出,甚至都不用用新数组存储,就循环判断加取余输出就好了

代码如下(示例):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HJ04_SpliceString_1
{
    class Program
    {
        public static void Main(string[] args)
        {
            string line;
            while ((line = System.Console.ReadLine()) != null)
            {
                if (String.IsNullOrWhiteSpace(line.Trim()))
                {
                    return;
                }
                /* 看了别人的首先知道了paleft(),padRight()两个方法,不亏,
                 * 其次我居然木想到可以先补零再输出,甚至都不用用新数组存储,
                 * 就循环判断加取余输出就好了
                 * 比起我的第一个复杂分情况,这个只分了大于8和小于等于8
                 * 大于0不能整除的在外面补零就好
                 */
                 // 大于8
                while (line.Trim().Length > 8)
                {
                    // 两个int重载,自0开始,截调用者的8个字符返回
                    Console.WriteLine(line.Trim().Substring(0, 8));
                    // 一个int重载,截掉调用者的前8个返回剩下的,第一个方法我用的remove()
                    line = line.Trim().Substring(8);
                }
                // 小于等于8
                // 最后一组数 PadRight(),第一个参数代表位数,
                // 后面的代表补充的字符,不传入就补空格
                Console.WriteLine(line.Trim().PadRight(8, '0'));
            }
        }
    }
}


  1. 官方解法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HJ04_StringSplic_2_OfficialSolu
{
    class Program
    {
        public static void Main(string[] args)
        {
            /*
             * 官方解法,先补零后遍历
             */
            #region 求解
            string line = string.Empty;
            while ((line = System.Console.ReadLine()) != null)
            {
                // 判空
                if (string.IsNullOrWhiteSpace(line))
                {
                    return;
                }
                // 提前补零
                while (line.Length % 8 != 0)
                {
                    line += "0";
                }
                // 8位一输出
                char[] c = line.ToCharArray();
                for (int i = 0; i < c.Count(); i++)
                {
                    Console.Write(c[i]);
                    if (i % 8 == 7)
                    {
                        Console.WriteLine();
                    }
                }
            }
            #endregion
        }
    }
}


总结

好好加油吧,这波我进华为OD希望渺茫,但是给我打开了新世界大门,也养了良好的利用电脑获取资料的习惯,加油。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值