前言
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'));
}
}
}
}
- 官方解法
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希望渺茫,但是给我打开了新世界大门,也养了良好的利用电脑获取资料的习惯,加油。