समस्या विवरण
एक स्ट्रिंग दी गई है, उसका रिवर्स पैटर्न प्रिंट करें जहां प्रत्येक पंक्ति बढ़ती लंबाई में रिवर्स ऑर्डर में वर्ण दिखाती है, और स्ट्रिंग समाप्त होने पर शेष स्थान '*' से भरें।
उदाहरण
इनपुट: "abcd"
a c b * * d
इनपुट: "tutorialspoint"
t u t o r i a l t u * * * * o * * * * * i * * * * * * n * * * * * * * t
पैटर्न तर्क
- पंक्ति 1: इंडेक्स 0 से 1 वर्ण (रिवर्स: इंडेक्स 0)
- पंक्ति 2: इंडेक्स 0-1 से 2 वर्ण (रिवर्स: इंडेक्स 1, 0)
- पंक्ति 3: इंडेक्स 0-2 से 3 वर्ण (रिवर्स: इंडेक्स 2, 1, 0)
- ...
- जब इंडेक्स ≥ स्ट्रिंग लंबाई: '*' प्रिंट करें
C प्रोग्राम
#include <stdio.h>
#include <string.h>
void reverse_pattern(char str[]) {
int n = strlen(str);
for (int i = 0; i < n; i++) {
// वर्तमान पंक्ति के लिए प्रारंभिक इंडेक्स: त्रिकोणीय संख्या - 1
int k = (i * (i + 1)) / 2 - 1;
for (int j = 0; j <= i; j++) {
if (k >= n - 1) {
printf("* ");
} else if (k >= 0) {
printf("%c ", str[k]);
} else {
printf("* ");
}
k--;
}
printf("\n");
}
}
int main() {
char str[100];
printf("स्ट्रिंग दर्ज करें: ");
scanf("%99s", str);
reverse_pattern(str);
return 0;
}
नमूना आउटपुट
स्ट्रिंग दर्ज करें: abcd a c b * * d * * * *
सुधारित संस्करण (बेहतर तर्क)
void reverse_pattern_v2(char str[]) {
int n = strlen(str);
int idx = 0;
for (int row = 1; row <= n; row++) {
// इस पंक्ति के लिए वर्ण (रिवर्स ऑर्डर में)
for (int i = 0; i < row; i++) {
int pos = idx + row - 1 - i;
if (pos < n)
printf("%c ", str[pos]);
else
printf("* ");
}
idx += row;
printf("\n");
if (idx >= n) break;
}
}
विविधताएं
1. पूर्ण त्रिकोण (कोई * नहीं)
इनपुट: "ABCDE" A B A C B A D C B A E D C B A
2. संख्या पैटर्न
इनपुट: "12345" 1 3 2 * * 4 * * * * 5
3. वैकल्पिक दिशा
// पंक्ति 1: फॉरवर्ड, पंक्ति 2: रिवर्स, पंक्ति 3: फॉरवर्ड...
for (int row = 1; row <= n; row++) {
if (row % 2 == 1) {
// फॉरवर्ड
for (int i = 0; i < row; i++) ...
} else {
// रिवर्स
for (int i = row-1; i >= 0; i--) ...
}
}
जटिलता
- समय: O(n²) जहां n = स्ट्रिंग लंबाई
- स्थान: O(1) अतिरिक्त