zoukankan      html  css  js  c++  java
  • 数据结构-字符串的排列

    题目:输入 一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc,acb,bac,bca,cab,cba

    分析:这个题目完全不会。根据标案分析发现一些细节需要注意,char* 和char[]的区别。

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

      为方便起见,用123来示例下。123的全排列有123、132、213、231、312、321这六种。首先考虑213和321这二个数是如何得出的。显然这二个都是123中的1与后面两数交换得到的。然后可以将123的第二个数和每三个数交换得到132。同理可以根据213和321来得231和312。因此可以知道——全排列就是从第一个数字起每个数分别与它后面的数字交换。找到这个规律后,递归的代码就很容易写出来了

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    char* p是一个指针,根本没分配内存,他指向的"abc123ABC" 是只读的,不能改变,你在下面给他赋值肯定是错的.而char p[]是一个数组,已经分配内存,是将"abc123ABC" 复制到该内存里面,这个内存是可读写的

    指针是不分配内存的,它指向的是系统的只读的内存,而数组是分配内存的,就是将系统的只读的内存里面的值复制到它的内存里面,因此可读写

    char* p是定义的一个指针。。他指向的字符窜"abc123ABC" 是存在不可修改的区域(代码区)的。。
    而char p[]是一个数组。。他的内容存在栈区可以修改

     char p[]="abc123ABC";

    该条语句执行的是字符串数组的赋值操作是正确的
    char *p="abc123ABC";
    字符指针变量p指向字符串常量"abc123ABC"的首地址
    字符串常量存放在数据区的“常量段”
    所以当你访问并修改时会内存出错
    正确的操作应该是:
    char * p = (char * )malloc(10);
    strcpy(p, "abc123ABC");

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    事实上数组和指针是有很大的区别的。

    1.两者在含义上的区别。

      数组对应着一块内存区域,而指针是指向一块内存区域。其地址和容量在生命期里不会改变,只有数组的内容可以改变;而指针却不同,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错。

    2.计算内存容量的区别。

      用运算符sizeof可以计算出数组的容量(字节数),而用sizeof却无法计算指针所指内存的容量,用sizeof(p)得到的结果永远是4或者2(即指针变量所占内存单元的字节数,一般情况下指针变量占2个或4个字节的内存单元)。在进行参数传递时,数组会自动退化为同类型的指针。

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /*
    剑指offer面试题28
    */
    #include <iostream>
    
    using namespace std;
    
    void Sort(char* Str,char* begin){
        if(*begin == ''){
            cout << Str << " " << flush;
        }
        else{
            for(char* pCh=begin;*pCh!='';++pCh){
    
    
                char tmp = *pCh;
                *pCh = *begin;
                *begin = tmp;
    
                //swap(*pCh,*begin);
                Sort(Str,begin+1);
                //swap(*pCh,*begin);
    
                tmp = *pCh;
                *pCh = *begin;
                *begin = tmp;
            }
        }
    }
    
    void Sort(char* Str){
        if(Str == NULL){
            return;
        }
    
        Sort(Str,Str);
    }
    
    int main()
    {
        char Str[] = "abc";
    
        Sort(Str);
    
        return 0;
    }
  • 相关阅读:
    PHP magic_quotes_gpc的详细使用方法
    tinkphp URL重写,支持伪静态
    element-UI中table表格的@row-click事件和@selection-change耦合了
    element-ui dialog组件添加可拖拽位置 可拖拽宽高
    vue.js 父组件如何触发子组件中的方法
    Element UI Form 每行显示多列,即多个 el-form-item
    vue组件的3种书写形式
    Java 微信公众号迁移
    Java 微信公众号导出所有粉丝(openId)
    [四]并发类容器
  • 原文地址:https://www.cnblogs.com/wn19910213/p/3749873.html
Copyright © 2011-2022 走看看