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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Google Interview - 数字旋转180度

發(fā)布時間:2024/3/12 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Google Interview - 数字旋转180度 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

找出1~10^n中數(shù)字翻轉(zhuǎn)過來是本身的數(shù)( 96 ->96, 18 -> 81, 0 -> 0, 其他數(shù)字翻過來都不是數(shù)字)

設(shè)計一個函數(shù),判斷某個只包含數(shù)字的字符串是不是Ambigram(比如,69,88,609,818等都是Ambigram)。Follow up:給一個整數(shù)n,找出所有長為n的Ambigram。

可以先求出n-2的答案,再利用n-2的答案求出n的答案,這題方法比較絕,往n-2的答案里面append兩個數(shù)字的時候分別各自加在兩邊就行,沒必要往中間插入。

public boolean isAmbigram(String s) {int start = 0, end = s.length()-1;while(start <= end) {char left = s.charAt(start++);char right = s.charAt(end--);int val = Integer.parseInt(left+""+right);if(val!=0 && val!=11 && val!=88 && val!=69 && val!=96) {return false;}}return true; }public List<String> generateAmbigram(int n) {if(n == 1) {return Arrays.asList("0", "1", "8");} else if(n == 2) {return Arrays.asList("00", "11", "88", "69", "96");}List<String> result = new ArrayList<>();List<String> list = generateAmbigram(n-2);for(String s:list) {result.add("0"+s+"0");result.add("1"+s+"1");result.add("8"+s+"8");result.add("6"+s+"9");result.add("9"+s+"6");}return result; }

?

另外一種文法:找出所有長度小于等于N的Ambigram。用動態(tài)規(guī)劃來解決。

public List<String> generateAmbigramDP(int n) {List<String> result = new ArrayList<>();if(n <= 0) return result;List<String>[] dp = new List[n];dp[0] = Arrays.asList("0", "1", "8");if(n == 1) return dp[0];dp[1] = Arrays.asList("00", "11", "88", "69", "96");for(int i=2; i<n; i++) {List<String> list = dp[i-2];dp[i] = new ArrayList<>();for(String s:list) {dp[i].add("0"+s+"0");dp[i].add("1"+s+"1");dp[i].add("8"+s+"8");dp[i].add("6"+s+"9");dp[i].add("9"+s+"6");}}for(List<String> list:dp) {result.addAll(list);}return result; }

?

再問:如果僅僅求有多少個長度為n的Ambigram呢?

【思路】

用動態(tài)規(guī)劃來做。

?

if i is even,?f[i] = f[i-1] + f[i-2] * 2 ?

if i is odd, ??f[i] = f[i-1] * 3?

?

// f[3] = f[2]*3 = 12;

// 101, 808, 609, 906

// 111, 818, 619, 916

// 181, 888, 689, 986

?

// f[4] = f[3] + f[2]*2 = 20

// - insert the same middle digit to every number in f[3]

// 1001, 8008, 6009, 9006

// 1111, 8118, 6119, 9116

// 1881, 8888, 6889, 9886

// - insert 69, 96 to every number in f[2]

// 1691, 8698, 6699, 9696

// 1961, 8968, 6969, 9966

public static int count180Number(int n) { // n is number of digitsint[] f = new int[n+1];f[1] = 3; // 0, 1, 8f[2] = 4; // 11, 88, 69, 96for(int i=3; i<=n; i++) {if(i % 2 == 0) { // i is evenf[i] = f[i-1] + f[i-2] * 2; } else {f[i] = f[i-1] * 3;}}int cnt = 0;for(int num:f) {cnt += num;}return cnt; }

?

?

總結(jié)

以上是生活随笔為你收集整理的Google Interview - 数字旋转180度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。