Trang chủ Tin Học Lớp 9 Dãy đối xứng: Dãy gọi là đối xứng nếu viết...

Dãy đối xứng: Dãy gọi là đối xứng nếu viết các phần tử của nó theo thứ tự ngược lại thì vẫn được chính nó. Dãy được gọi là khả đối xứng nếu đổi chỗ các phần tử

Câu hỏi :

Dãy đối xứng: Dãy gọi là đối xứng nếu viết các phần tử của nó theo thứ tự ngược lại thì vẫn được chính nó. Dãy được gọi là khả đối xứng nếu đổi chỗ các phần tử của nó thì được dãy đối xứng. Cho dãy số nguyên, kiểm tra xem dãy có khả đối xứng không? Nếu không có, biến đổi nó để được một dãy đối xứng. pascal ạ giúp mik với ạ

Lời giải 1 :

program xaudoixung;

var
  s : string;
  oddChar : char;
  odd : boolean; // odd = True nếu tìm thấy 1 phần tử lẻ
  // Lưu lại số lần xuất hiện của các kí tự từ 'A' -> 'z'
  mark : array ['A' .. 'z'] of byte;

// Trả về true nếu khả đối xứng
function khadoixung: boolean;
  // Dãy khả đối xứng là dãy có số lần xuất hiện các kí tự là chẵn
  // Có ngoại lệ là s[i] là kí tự ở giữa thì có thể lẻ lần xuất hiện nếu độ dài S lẻ
  // Vậy nên trong dãy được phép xuất hiện 1 phần tử lẻ duy nhất
  var
    i : byte;
    c : char;
    result : boolean;
  begin
    result:=true;
    for c:='A' to 'z' do mark[c]:=0;
    for i:=1 to length(s) do inc(mark[s[i]]);
    // Kiểm tra số lần xuất hiện
    odd:=false;
    for c:='A' to 'z' do 
      if mark[c] mod 2 <> 0 then 
        begin
          // Nếu đã tìm thấy số lẻ trước đấy thì không hợp lệ
          if odd = true then
            begin
              result:=false;
              break;
            end
          // Nếu chưa tìm thấy số lẻ ở trước
          else
            begin
              odd:=true;
              oddChar:=c
            end
        end;
    khadoixung:=result;
  end;

// Biến đổi S thành đối xứng nếu S khả đối xứng
function doixung: string;
  var
    i, mid, j : byte;
    c : char;
    s1 : string;
  begin
    // Gán s1 = s để s1 có độ dài = s
    s1:=s;
    if odd = true then
      begin
        mid:=length(s) div 2 + 1;
        for i:=mid-(mark[oddChar] div 2) to mid+(mark[oddChar] div 2) do
          s1[i]:=oddChar;
      end;
    j:=1;
    for c:='A' to 'z' do 
      if mark[c] mod 2 = 0 then 
        for i:=j to j+(mark[c] div 2)-1 do
          begin
            s1[i]:=c;
            s1[length(s)-i+1]:=c;
            inc(j);
          end;
    doixung:=s1;
  end;

begin
  read(s);
  if khadoixung then 
    begin
      writeln('YES');
      writeln(doixung);
    end
  else 
    writeln('NO');
end.

Thảo luận

-- ko xâu đc ko mik làm theo mảng đc ko
-- được đổi string thành array, với mỗi chỗ là length(s) thì thành độ dài mảng
-- 'A'..'z' thành 0..9

Bạn có biết?

Tin học, tiếng Anh: informatics, tiếng Pháp: informatique, là một ngành khoa học chuyên nghiên cứu quá trình tự động hóa việc tổ chức, lưu trữ, xử lý và truyền dẫn thông tin của một hệ thống máy tính cụ thể hoặc trừu tượng (ảo). Với cách hiểu hiện nay, tin học bao hàm tất cả các nghiên cứu và kỹ thuật có liên quan đến việc mô phỏng, biến đổi và tái tạo thông tin.

Nguồn : Wikipedia - Bách khoa toàn thư

Tâm sự 9

Lớp 9 - Là năm cuối ở cấp trung học cơ sở, sắp phải bước vào một kì thi căng thẳng và sắp chia tay bạn bè, thầy cô và cả kì vọng của phụ huynh ngày càng lớn mang tên "Lên cấp 3". Thật là áp lực nhưng các em hãy cứ tự tin vào bản thân là sẻ vượt qua nhé!

Nguồn : ADMIN :))

Liên hệ hợp tác hoặc quảng cáo: gmail

Điều khoản dịch vụ

Copyright © 2021 HOCTAPSGK