日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【IT笔试面试题整理】字符串的排列

發布時間:2025/7/25 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【IT笔试面试题整理】字符串的排列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【試題描述】輸入一個字符串,打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab,cba。

分析:這是一道很好的考查對遞歸理解的編程題,因此在過去一年中頻繁出現在各大公司的面試、筆試題中。

我們以三個字符abc為例來分析一下求字符串排列的過程。首先我們固定第一個字符a,求后面兩個字符bc的排列。當兩個字符bc的排列求好之后,我們把第一個字符a和后面的b交換,得到bac,接著我們固定第一個字符b,求后面兩個字符ac的排列。現在是把c放到第一位置的時候了。記住前面我們已經把原先的第一個字符a和后面的b做了交換,為了保證這次c仍然是和原先處在第一位置的a交換,我們在拿c和第一個字符交換之前,先要把b和a交換回來。在交換b和a之后,再拿c和處在第一位置的a進行交換,得到cba。我們再次固定第一個字符c,求后面兩個字符b、a的排列。

既然我們已經知道怎么求三個字符的排列,那么固定第一個字符之后求后面兩個字符的排列,就是典型的遞歸思路了。

為方便起見,用123來示例下。123的全排列有123、132、213、231、312、321這六種。首先考慮213和321這二個數是如何得出的。顯然這二個都是123中的1與后面兩數交換得到的。然后可以將123的第二個數和每三個數交換得到132。同理可以根據213和321來得231和312。因此可以知道——全排列就是從第一個數字起每個數分別與它后面的數字交換。找到這個規律后,遞歸的代碼就很容易寫出來了:

對于一個n 位的字符串來講,它是n-1位字符串的排列 加上 沒有在 n -1 位字符串里 那個字符 的排列。 有點難理解,用例子說明:對于字符串ABC來講,它所有的排列就是 A + BC 的排列 加上 B + AC 的排列,再加上 C + AB的排列。而BC的排列是 B + C 的排列 加上 C + B 的排列。所以,對一個字符串,我們從中去一個值,然后求剩余部分的排列,然后把它們再組合在一起。所有,代碼如下

【參考代碼】

如果字符串中有重復字符的話,這個方法肯定不會符合要求的

1 public static void permutation(char[] arr, int begin) 2 { 3 // if pBegin points to the end of string, 4 // this round of permutation is finished, 5 // print the permuted string 6 7 if (begin == arr.length) 8 System.out.println(Arrays.toString(arr)); 9 else 10 { 11 for (int i = begin; i < arr.length; i++) 12 { 13 swap(arr, i, begin); 14 permutation(arr, begin + 1); 15 // restore pCh and pBegin 16 // PS:改變字符串順序后必須還原回來! 17 swap(arr, i, begin); 18 } 19 } 20 } 21 22 public static void swap(char[] arr, int i, int j) 23 { 24 char temp = arr[i]; 25 arr[i] = arr[j]; 26 arr[j] = temp; 27 }

二、去掉重復的全排列的遞歸實現

由于全排列就是從第一個數字起每個數分別與它后面的數字交換。我們先嘗試加個這樣的判斷——如果一個數與后面的數字相同那么這二個數就不交換了。如122,第一個數與后面交換得212、221。然后122中第二數就不用與第三個數交換了,但對212,它第二個數與第三個數是不相同的,交換之后得到221。與由122中第一個數與第三個數交換所得的221重復了。所以這個方法不行。

換種思維,對122,第一個數1與第二個數2交換得到212,然后考慮第一個數1與第三個數2交換,此時由于第三個數等于第二個數,所以第一個數不再與第三個數交換。再考慮212,它的第二個數與第三個數交換可以得到解決221。此時全排列生成完畢。
這樣我們也得到了在全排列中去掉重復的規則——去重的全排列就是從第一個數字起每個數分別與它后面非重復出現的數字交換。

1 // 在[nBegin,nEnd)區間中是否有字符與下標為pEnd的字符相等 2 static boolean isSwap(char[] arr ,int pBegin, int pEnd) 3 { 4 int p; 5 for (p = pBegin; p < pEnd; p++) 6 { 7 if (arr[p] == arr[pEnd]) 8 return false; 9 } 10 return true; 11 } 12 13 public static void permutation2(char[] arr, int begin) 14 { 15 // if pBegin points to the end of string, 16 // this round of permutation is finished, 17 // print the permuted string 18 if (begin == arr.length) 19 System.out.println(Arrays.toString(arr)); 20 21 else 22 { 23 for (int i = begin; i < arr.length; i++) 24 { 25 if (isSwap(arr,begin, i)) 26 { 27 swap(arr, begin, i); 28 permutation(arr, begin + 1); 29 // restore pCh and pBegin 30 // PS:改變字符串順序后必須還原回來! 31 swap(arr, begin, i); 32 } 33 } 34 } 35 }

?三、全排列的非遞歸實現
??? 要考慮全排列的非遞歸實現,先來考慮如何計算字符串的下一個排列。如"1234"的下一個排列就是"1243"。只要對字符串反復求出下一個排列,全排列的也就迎刃而解了。
如何計算字符串的下一個排列了?來考慮"926520"這個字符串,我們從后向前找第一雙相鄰的遞增數字,"20"、"52"都是非遞增的,"26 "即滿足要求,稱前一個數字2為替換數,替換數的下標稱為替換點,再從后面找一個比替換數大的最小數(這個數必然存在),0、2都不行,5可以,將5和2交換得到"956220",然后再將替換點后的字符串"6220"顛倒即得到"950226"。
對于像“4321”這種已經是最“大”的排列,采用STL中的處理方法,將字符串整個顛倒得到最“小”的排列"1234"并返回false。

這樣,只要一個循環再加上計算字符串下一個排列的函數就可以輕松的實現非遞歸的全排列算法。按上面思路并參考STL中的實現源碼,不難寫成一份質量較高的代碼。值得注意的是在循環前要對字符串排序下,可以自己寫快速排序的代碼

轉:http://blog.csdn.net/zz198808/article/details/7657168

總結:
1、全排列就是從第一個數字起每個數分別與它后面的數字交換。
2、去重的全排列就是從第一個數字起每個數分別與它后面非重復出現的數字交換。
3、全排列的非遞歸就是由后向前找替換數和替換點,然后由后向前找第一個比替換數大的數與替換數交換,最后顛倒替換點后的所有數據。

?

字符串全排列擴展----八皇后問題
??? 題目:在8×8的國際象棋上擺放八個皇后,使其不能相互攻擊,即任意兩個皇后不得處在同一行、同一列或者同一對角斜線上。下圖中的每個黑色格子表示一個皇后,這就是一種符合條件的擺放方法。請求出總共有多少種擺法。

?


?

??? 這就是有名的八皇后問題。解決這個問題通常需要用遞歸,而遞歸對編程能力的要求比較高。因此有不少面試官青睞這個題目,用來考察應聘者的分析復雜問題的能力以及編程的能力。

由于八個皇后的任意兩個不能處在同一行,那么這肯定是每一個皇后占據一行。于是我們可以定義一個數組ColumnIndex[8],數組中第i個數字表示位于第i行的皇后的列號。先把ColumnIndex的八個數字分別用0-7初始化,接下來我們要做的事情就是對數組ColumnIndex做全排列。由于我們是用不同的數字初始化數組中的數字,因此任意兩個皇后肯定不同列。我們只需要判斷得到的每一個排列對應的八個皇后是不是在同一對角斜線上,也就是數組的兩個下標i和j,是不是i-j==ColumnIndex[i]-Column[j]或者j-i==ColumnIndex[i]-ColumnIndex[j]。

?

?

轉載于:https://www.cnblogs.com/WayneZeng/archive/2013/04/09/3011233.html

總結

以上是生活随笔為你收集整理的【IT笔试面试题整理】字符串的排列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本激情一区 | 成人在线免费小视频 | 国产欧美日韩综合精品一区二区 | 最好看的2019年中文视频 | 日韩午夜免费 | 奶水旺盛的女人伦理 | av手机天堂网 | 国产人成一区二区三区影院 | 亚洲最新在线视频 | 手机看片日韩在线 | 亚洲天堂第一区 | 久久精品日韩无码 | 伊人狼人影院 | 国产三级三级看三级 | 香蕉视频网址 | 欧美日韩图片 | 四虎影库永久在线 | 国产高清不卡视频 | 久久国产精品波多野结衣 | 国产做爰免费观看视频 | 性爱动漫 | 国产日韩成人内射视频 | 老女人一区 | 国产精品短视频 | 午夜视频一区二区 | 国产在线天堂 | 亚洲精品久久夜色撩人男男小说 | 欧美色图11p| 一个人看的视频www 色就是色网站 | 欧美激情一区二区在线 | 国产熟妇一区二区三区aⅴ网站 | 天堂视频免费看 | 成人小视频在线看 | 日本免费网站视频 | 免费观看在线视频 | 午夜黄色| 国产精品12页 | 亚洲国产影视 | 国产v亚洲v天堂无码 | 波多野结衣在线观看一区二区三区 | 在线看的av网站 | 黄色a在线| 电车痴汉在线观看 | 免费观看理伦片在线播放视频软件 | 国精产品一区一区三区有限公司杨 | 一进一出好爽视频 | 91色视频 | 国产高清二区 | 国产福利视频在线 | 亚洲黄网在线观看 | 天天拍天天色 | 男人爱看的网站 | 国产精品日韩精品欧美精品 | 激情一区二区三区 | 黄色av片三级三级三级免费看 | 欧美图片自拍偷拍 | 丁香六月在线 | 久久久久久久久久91 | 亚洲国产aⅴ精品一区二区 日韩黄色在线视频 | 色香蕉网站 | 香港黄色网 | 在线观看免费看片 | 在线观看欧美国产 | 岛国午夜视频 | 国产偷人妻精品一区二区在线 | 四季av在线一区二区三区 | av免费在线观看网站 | 黄色网页在线免费观看 | 免费亚洲一区二区 | 色综合亚洲 | 天天曰 | 成人av网站在线观看 | 久久午夜鲁丝片午夜精品 | 三级视频网站 | 国产又粗又硬视频 | 日本高清视频免费观看 | 一本一道久久a久久综合蜜桃 | 亚洲成人www| 女人18岁毛片 | 黑人巨大猛交丰满少妇 | a级片网址 | 国产精品爽爽爽 | 国产精品嫩草av | 狠狠躁天天躁夜夜躁婷婷 | 自拍偷拍福利视频 | 无码不卡av东京热毛片 | 玩弄丰满少妇xxxxx性多毛 | 国产又粗又猛又爽又黄 | 天天干,天天操,天天射 | 小草av| 男人和女人日批 | 中文字幕五码 | 人妻熟女aⅴ一区二区三区汇编 | 国内露脸中年夫妇交换 | 自拍偷拍第 | 欧美成人免费播放 | 有奶水的迷人少妇 | 两女双腿交缠激烈磨豆腐 | 6680新视觉电影免费观看 |