我正在尝试HackerRank中的挑战/问题。 (您无需登录即可查看问题,对于那些不希望通过链接查看问题的人,我会简要介绍问题陈述。)
https://www.hackerrank.com/challenges/time-conversion
给定AM / PM格式的日期(02:34:50 PM)的指定输入(字符串),我必须将其转换为军事时间(14:34:50)。 Military的午夜时间为00:00:00,AM / PM格式为12:00:00 AM,Milatary的下午时间为12:00:00,AM / PM格式为12:00:00 PM。
现在我使用的方法是检查字符串的第二个最后一个值,因为指定了输入格式。 B / c我只需要更改小时数我只取第0个和第1个字符串索引,使用“GetNumericValue”将其转换为double。
现在当我在IF语句中使用这些双精度值时(在PM if块中),如果我检查“!=”,它们就会失败。我已经给出了下面的代码。在使用调试器并查看发生了什么后,它完全放弃了包含“!=”的IF语句。如果我的输入在其第一个索引中具有“1”或在其第二个索引中具有“2”,则会发生这种情况。
起初我认为这可能是一个问题,精度为double这么小的数字,但是,如果输入“01:xx:xxPM”,我的代码会给出正确的答案。所以我倾向于认为它是我的IF语句的逻辑,虽然我已经盯着它看了这么久,但我不知道它为什么不起作用。我给了我编写的替代代码片段。我基本上做了同样的事情,除了我使用“==”和一个else语句(在我使用“!=”和else语句之前)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HackerRank_Algorithms
{
class Time_Conversion
{
static void Main(string[] args)
{
//Reading input Date in the format "02:34:50PM"
string time = Console.ReadLine();
//Creating a double array for storing the first digits that is the hours
//used double since 'GetNumericValue' returns type double
double[] timeIn24 = new double[2];
//loop to convert the first two digits from string into double
for (int x = 0; x < 2; x++)
{
timeIn24[x] = char.GetNumericValue(time, x);
}
//Because I know the date will always be in a specified format I check at the place for
//'P' or 'A' for AM or PM
//If PM then do this
if (time[time.Length-2] == 'P')
{
//Console.WriteLine("Time is PM");
/********************************************
//I tried doing this since but didn't work
//timeIn24[1] = Convert.ToInt32(timeIn24[1]);
//timeIn24[0] = Convert.ToInt32(timeIn24[0]);
*********************************************/
//Console.WriteLine("Before {0} timeIn24[0]", timeIn24[0]);
//Console.WriteLine("Before {0} timeIn24[1]", timeIn24[1]);
//PROBLEM OCCURRING HERE I check if its 12PM or not if it isn't then I do the follwoing
if (timeIn24[1] != 2 && timeIn24[0] != 1)
{
//add 2 to the unit of hours
timeIn24[1] = timeIn24[1] + 2;
//Console.WriteLine("After addition {0} timeIn24[0]", timeIn24[0]);
//if the sum i get is greater than 10 that is I'm getting a carry
if (timeIn24[1] > 9)
{
//I add one to the tenth of hours
timeIn24[0] = timeIn24[0] + 1;
//Modulus to get the last digit of unith hour
timeIn24[1] = timeIn24[1] % 10;
}
timeIn24[0] = timeIn24[0] + 1;
Console.Write("{0}{1}", timeIn24[0], timeIn24[1]);
//Console.WriteLine(timeIn24[0]);
//Console.WriteLine(timeIn24[1]);
}
else //if its 12PM then I do not do anything and I print it as is
{
Console.Write("{0}{1}", timeIn24[0], timeIn24[1]);
}
/***********CODE THAT GAVE THE CORRECT SOLUTION******************/
//if (timeIn24[1] == 2 && timeIn24[0] == 1)
//{
// Console.Write("{0}{1}", timeIn24[0], timeIn24[1]);
// //timeIn24[0] = timeIn24[0] / 10;
// //Console.WriteLine(timeIn24[0]);
// //Console.WriteLine(timeIn24[1]);
//}
//else
//{
// timeIn24[1] = timeIn24[1] + 2;
// //Console.WriteLine("After addition {0} timeIn24[0]", timeIn24[0]);
// if (timeIn24[1] > 9)
// {
// timeIn24[0] = timeIn24[0] + 1;
// timeIn24[1] = timeIn24[1] % 10;
// }
// timeIn24[0] = timeIn24[0] + 1;
// Console.Write("{0}{1}", timeIn24[0], timeIn24[1]);
//}
/******************************************************************/
//Here I simply start from the first colon and print the date as string till end
int y = 2;
while( y < time.Length-2)
{
Console.Write("{0}", time[y]);
y++;
}
}
else //if its AM
{
//if its 12AM that is Midnight
if (timeIn24[0] == 1 && timeIn24[1] == 2)
{ //set both tenth and unit of hour to 0
timeIn24[0] = 0;
timeIn24[1] = 0;
}
//print the hours
Console.Write("{0}{1}", timeIn24[0], timeIn24[1]);
//again print from first colon + the remaining of string
int x = 2;
while ( x < time.Length-2)
{
Console.Write("{0}", time[x]);
x++;
}
}
Console.ReadLine();
}
}
}
答案 0 :(得分:0)
问题确实在于if
声明。考虑使用10:00:00AM
作为输入。在这种情况下,timeIn24[1] != 2
将评估为true
(因为第二个数字为0,而不是2),但第二个部分timeIn24[0] != 1
将评估为false
,因为第一个数字确实是1.由于您正在使用&&
,这两个方需要评估为true
才能输入if
语句。
如果您使用||
(或)代替&&
(和),if
语句应该可以正常运行,因为如果 数字不是&#39 ; t等于正确的值,代码将进入if
块。
当然,和其他人一样,除非挑战明确禁止,否则使用内置DateTime
类型会更加简单。