列表

详情


WY20. 两种排序方法

描述

考拉有n个字符串字符串,任意两个字符串长度都是不同的。考拉最近学习到有两种字符串的排序方法: 1.根据字符串的字典序排序。例如:
"car" < "carriage" < "cats" < "doggies < "koala"
2.根据字符串的长度排序。例如:
"car" < "cats" < "koala" < "doggies" < "carriage"
考拉想知道自己的这些字符串排列顺序是否满足这两种排序方法,考拉要忙着吃树叶,所以需要你来帮忙验证。

输入描述

输入第一行为字符串个数n(n ≤ 100) 接下来的n行,每行一个字符串,字符串长度均小于100,均由小写字母组成

输出描述

如果这些字符串是根据字典序排列而不是根据长度排列输出"lexicographically",
如果根据长度排列而不是字典序排列输出"lengths",
如果两种方式都符合输出"both",否则输出"none"

示例1

输入:

3
a
aa
bbb

输出:

both

原站题解

Pascal 解法, 执行用时: 1ms, 内存消耗: 256KB, 提交时间: 2018-09-15

var
    l:array[0..200] of longint;
    s:array[0..200] of string[150];
    n,i:longint;
    f1,f2:boolean;
begin
    readln(n);
    for i:=1 to n do
    begin
        readln(s[i]);
        l[i]:=length(s[i]);
    end;
    f1:=true; f2:=true;
    for i:=2 to n do
        if s[i]<s[i-1] then
        begin
            f1:=false;
            break;
        end;
    for i:=2 to n do
        if l[i]<l[i-1] then
        begin
            f2:=false;
            break;
        end;
    if f1 and f2 then writeln('both')
    else if f1 then writeln('lexicographically')
        else if f2 then writeln('lengths')
            else writeln('none');
end.

C 解法, 执行用时: 1ms, 内存消耗: 336KB, 提交时间: 2021-07-22

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#define not !

// 优化版的冒泡排序
void* bubble_sort(void* __base,
                  const size_t __nmemb,
                  const size_t __size,
                  int (*__cmp) (const void*, const void*));

// According to 字串字典序比较字串间的优先关系
int comp_by_str_lexicographically(const void* s1, const void* s2);

// According to 字串长度比较字串间的优先关系
int comp_by_str_len(const void* s1, const void* s2);

// 复制字串数组
void clone_strs(char** destination, const char** source, const size_t size);

void swap(const void* a, const void* b, const size_t __size);

int str_len(const char* s);

int main(const int argc, const char** const argv) {
  int n;
  scanf("%d", &n);
  char* strs[100];
  
  int i;
  for (i = 0; i < n; ++i) {
    *(strs + i) = (char*) malloc(101 * sizeof(char));
    scanf("%s", *(strs + i));
  }
  
  char *strs2[100], *strs3[100];
  for (i = 0; i < n; ++i) {
    *(strs2 + i) = (char*) malloc(101 * sizeof(char));
    *(strs3 + i) = (char*) malloc(101 * sizeof(char));
  }
  clone_strs(strs2, strs, n);
  clone_strs(strs3, strs, n);
 
  bubble_sort(strs2, n, sizeof(char*), comp_by_str_lexicographically);
  bubble_sort(strs3, n, sizeof(char*), comp_by_str_len);
  
  int sorted_by_lexicographically = 1, sorted_by_len = 1;
  for (i = 0; i < n; ++i) {
    if (strcmp(*(strs2 + i), *(strs + i))) {
      sorted_by_lexicographically = 0;
      break;
    }
  }
  for (i = 0; i < n; ++i) {
   if (strcmp(*(strs3 + i), *(strs + i))) {
      sorted_by_len = 0;
      break;
    }
  }
  
  if (sorted_by_lexicographically && sorted_by_len) puts("both");
  else if (sorted_by_lexicographically)             puts("lexicographically");
  else if (sorted_by_len)                           puts("lengths");
  else                                              puts("none");

  return 0;
}

void* bubble_sort(void* __base,
                  const size_t __nmemb,
                  const size_t __size,
                  int (*__cmp) (const void*, const void*)) {
  
  int t, i, exchange;
  for (t = 0; t < __nmemb - 1; ++t) {
    exchange = 0;
    for (i = 0; i < __nmemb - 1 - t; ++i) {
      if (__cmp((char*) __base + i * __size, (char*) __base + (i + 1) * __size) > 0) {
        swap((char*) __base + i * __size, (char*) __base + (i + 1) * __size, __size);
        exchange = 1;
      }
    }
    
    if (not exchange) break;
  }
  
  return __base;
}

void swap(const void* a, const void* b, const size_t __size) {
  int i;
  for (i = 0; i < __size; ++i) {
    *((char*) a + i) ^= *((char*) b + i);
    *((char*) b + i) ^= *((char*) a + i);
    *((char*) a + i) ^= *((char*) b + i);
  }
}

int comp_by_str_lexicographically(const void* s1, const void* s2) {
  return strcmp(*(char**) s1, *(char**) s2);
}

int comp_by_str_len(const void* s1, const void* s2) {
  return str_len(*(char**) s1) - str_len(*(char**) s2);
}

int str_len(const char* s) {
  assert(s);
  if (!*s) return 0;
  
  const char* p = s;
  while (*++p);
  
  return p - s;
}

void clone_strs(char** destination, const char** source, const size_t size) {
  int i;
  for (i = 0; i < size; ++i)
    strcpy(*(destination + i), *(source + i));
}

上一题