這是我試圖求解leetcode 第六題,這不重要,主要看一下程序裡面那個if語句的執行
問題,不用看我針對這道題的邏輯對不對,這不是重點,重點是那個if語句!!!
在代碼那個(***)的地方我給了注釋!!!
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main()
{
string s;
int numRows;
cin >> s >> numRows;
char *ss = new char[s.size()];
int k = 2 * numRows - 2;//每個單元元素的個數
int m = s.size() / k;//一共有多少個單元
int flag = s.size() % k;
if(flag != 0)
m++;
int n = 2 * m;
//先對第一行單獨處理
for(int i = 0, j = 0; j < m; ++j, i = i + k)
{
ss[j] = s[i];
}
//對第二行至倒數第二行的處理
//i =(所在行 - 1)
//j =(所在列 - 1)
int count = 0;
int i = 1, j = 0;
int x;
cout << endl;
while(i < numRows - 1)
{
while(count < n)
{
//偶數列時要加上行數,奇數列時要減去行數
if(j % 2 == 1)
x = 1;
else
x = -1;
int num = (j / 2 + j % 2);//0 1 2 3 4 5 6 -> 0 1 1 2 2 3 3
cout << "k:" << k << '\n' << "num:" << num << '\n';
cout << "i:" << i << '\n' << "x:" << x << '\n';
cout << "s.size():" << s.size() << endl;
//這裡輸入PAYPALISHIRING 3 之後 k=4,num=0,i=1,x=-1,s.size()=14明顯if語句執行不了,
//但是居然執行了,我好郁悶啊!!!求解!!!
(***) if((k*num+i*x) >= s.size())
{
cout << "DDDDDDDDD" << endl;
break;
}
//m代表第一行元素的個數
cout << "CCCCCCCCCC" << endl;
ss[m+n*(i-1)+j] = s[k*num+i*x];
cout << s[k*num+i*x];
j++;
count++;
}
i++;
}
//對最後一行進行處理
i--;
j--;
for(int jj = m+n*(i-1)+j, ii = numRows-1; ii < s.size() && jj < s.size(); ++jj, ii = ii + k)
{
ss[jj] = s[ii];
}
cout << ss << endl;
return 0;
}
s.size()返回的是unsigned int,如果不強制轉換成int類型的話,就會用一個-1的int和14的unsignedint比較,-1轉換成unsigned int會是一個很大的數值
if((k*num+i*x) >= ((int)s.size()))