Đây là mã trong C mà không sử dụng bất kỳ chức năng bên ngoài: Nó xoay chuỗi tại chỗ cả phía trước và phía sau bởi bất kỳ giá trị bất kể có bao lớn.
int stringRotate(int value)
{
unsigned long I,J,K;
unsigned long index0;
unsigned long temp1,temp2;
unsigned long length;
length = stringLength;
if (value < 0)
value = length - ((0 - value) % length);
if (value > length)
value = value % length;
J = 0;
index0 = J;
temp1 = stringData[J];
for (I = 0;I < length;I++)
{
K = (J + value) % length;
temp2 = stringData[K];
stringData[K] = temp1;
J = K;
temp1 = temp2;
if (J == index0)
{
J++;
index0 = J;
temp1 = stringData[J];
}
}
return 1;
}
Để xoay chuỗi cả phía trước và phía sau sẽ là một chút tẻ nhạt vì thế nó là tốt hơn để chỉ làm phía trước xoay và tính giá trị chính xác cho backwards.Also nếu giá trị luân chuyển là hơn độ dài của chuỗi , sau đó chúng tôi có thể chỉ cần clip nó kể từ khi kết quả sẽ là như nhau anyway.
giá trị = chiều dài - ((0 - giá trị)% length): có nghĩa là giá trị xoay là âm, sau đó đặt giá trị cho độ dài của chuỗi, trừ đi kết quả tích cực của phần còn lại chia giá trị chiều dài của chuỗi. Ví dụ: xoay một chuỗi có độ dài từ 10 đến 9 vị trí sẽ giống như xoay vòng +1. Xoay cùng một chuỗi bởi -19 vị trí cũng sẽ giống như xoay theo cộng một. giá trị = value% length: có nghĩa là nếu giá trị dương lớn hơn chiều dài chuỗi, sau đó chia cho độ dài chuỗi và lấy phần còn lại. Kết quả sẽ giống như khi chúng tôi làm điều đó một chặng đường dài.
Để thực hiện xoay vòng tại chỗ, chúng tôi sẽ cần phải nhảy theo giá trị của vòng xoay để trao đổi các ký tự cách xa nhau. Chúng tôi bắt đầu ở vị trí 0, di chuyển về phía trước bởi giá trị xoay và tiếp tục nhảy theo số lượng đó. nếu chúng ta đi qua phần cuối của chuỗi, chúng ta chỉ đơn giản là quấn lại từ đầu. Vấn đề là nếu giá trị là một số chẵn, chúng ta sẽ kết thúc đúng nơi chúng ta bắt đầu và sẽ bỏ lỡ tất cả các ký tự lẻ. Biến index0 là ở đó để cho biết chúng ta bắt đầu từ đâu. Nếu chúng ta quay trở lại chỉ số này thì chúng ta cần tiến lên một vị trí chỉ số và tiếp tục nhảy. Chúng tôi tiếp tục làm điều này cho đến khi tất cả các ký tự được hoán đổi Tại thời điểm này, chúng tôi cần hai biến tạm thời để thực hiện hoán đổi tại chỗ. J là vị trí bắt đầu. Chúng ta di chuyển ký tự ở chỉ mục J đến biến tạm thời đầu tiên. Bây giờ chúng tôi lặp tôi đến độ dài của chuỗi. K là chỉ mục đích, J cộng với giá trị xoay Được bọc quanh đầu nếu cần. Di chuyển ký tự ở chỉ mục K sang biến tạm thời thứ hai. Đặt ký tự từ chỉ mục J vào chỉ mục K bằng biến tạm thời đầu tiên. Bằng cách này, lý do tại sao chúng ta không chỉ di chuyển nhân vật trực tiếp từ chỉ mục J vào chỉ mục K là vì phần cuối của vòng lặp, các chỉ số có thể thay đổi giữa các vòng nhưng các ký tự trong temp1 không nên. Bây giờ chúng ta trao đổi temp1 với temp2. Phần cuối cùng này là nơi giá trị là số chẵn và chúng tôi quay lại nơi chúng tôi bắt đầu. Điều này sẽ xảy ra theo thời gian giá trị xoay trừ đi một. chỉ số gia tăng J bởi một và thiết lập lại các giá trị bắt đầu. Lặp lại cho đến khi hoàn thành.
Một cuộc biểu tình video có thể được tìm thấy ở đây: https://www.youtube.com/watch?v=TMzaO2WzR24
chỉ có sẵn cho sgi stl – Schildmeijer
phần 25.2.10 trong tiêu chuẩn C++ chỉ định std :: rotate –
Bằng cách này, nếu bạn cần xoay đúng, hãy sử dụng trình lặp ngược: std :: rotate (s.rbegin(), s.rbegin() + 1, s.rend()); và chuỗi trở thành "eabcd" –