(笔试题)最小的非“重复的数”

题目:

给一个定义:对一个整数,若其中存在相邻两位上的数字相同,则称其为“重复的数”;现给定一个正整数n,求不小于n的最小的非“重复的数”。

思路:

假设输入的数为n,则令m=n,

分别取m的最低两位数字a,b,

判断是否a==b,如果是说明是重复的数,那么递归调用n=m+1;考虑特殊情况,ab=99,产生进位后100仍未重复数,此时应该递归调用n=m+2;

如果a!=b,则往前挪一位,即m=m/10,直至m/10=0为止,最后返回n。

该思路也可以通过非递归来实现,详见代码。

代码:

#include <iostream>

using namespace std;

int calNonRepetitionNum(int n){
    if(n<10)
        return n+1;

    int a,b;
    int base=1;
    int m=n;

    while(m/10)
    {
        b=m%10;
        a=m/10%10;
        base*=10;

        if(a==b)
        {
            if(a==9)
                return calNonRepetitionNum((m+2)*base/10);
            else
                return calNonRepetitionNum((m+1)*base/10);
        }
        m/=10;
    }

    return n;
}

int calNonRepetitionNum_2(int n){
    if(n<10)
        return n+1;
    int a,b,m;
    int base;
    bool flag=true;
    while(flag){
        flag=false;
        m=n;
        base=1;
        while(m/10){
            a=m%10;
            b=m/10%10;
            base*=10;
            if(a==b){
                if(a==9){
                    n=(m+2)*base/10;
                    flag=true;
                    break;
                }
                else{
                    n=(m+1)*base/10;
                    flag=true;
                    break;
                }
            }
            m=m/10;
        }
    }
    return n;
}

int main()
{
    cout << calNonRepetitionNum(99) << endl;
    cout << calNonRepetitionNum_2(88) << endl;
    return 0;
}

  

时间: 2024-08-11 03:30:14

(笔试题)最小的非“重复的数”的相关文章

( 笔试题)只出现一次的数

题目: 1.给定一数组,数组中的数字均为int类型,除了一个数出现一次,其他都出现了两次,请找出这个数: 2.给定一数组,数组中的数字均为int类型,除了一个数出现一次,其他都出现了三次,请找出这个数: 思路: 这两道题,最容易想到的方法就是通过hashmap统计或者先排序后遍历的方法,但它们要么需要的空间复杂度高,要么时间复杂度高. 有没有一种方法,空间复杂度为常数,时间复杂度为O(n)? 其实两道题都可以通过位运算的简单方法来得到结果. 题目1: 相同的数异或等于0,因此将数组中所有的数全部

javascript 笔试题之删除数组重复元素

笔试时紧张没写出来,静下心后发现简单的要死. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="en"> <head> <meta http-equiv="Content-Type" content=&quo

前端笔试题:拍扁多维数组、提取URL中的参数变成对象、实现string的trim()函数、判断Email地址、16进制颜色转rgb格式

(1)拍扁数组 这是一个著名互联网公司今天的前端笔试题:多维数组维数不定,如[2,4,1,[2,3,4,[1,2],5,3],3,8]拍扁为[2,4,1,2,3,4,1,2,5,3,3,8].维数不定,应该要用递归: 答案: function flatten(arr){ var arrLength=arr.length; for(var i=0;i<arrLength;i++){ if(arr[i].constructor==Array){ arr.splice(i,1,flatten(arr[

2014年去哪儿网笔试题--给定一个整型数组,对这个整型素组排序,使得按序拼接数组各元素得到的值最小。

2014年去哪儿网笔试题--给定一个整型数组,对这个整型素组排序,使得按序拼接数组各元素得到的值最小. 我的大致思路是把这个整型数组转换成String数组,然后通过String类的compareTo方法对这个数组进行第一次排序,排序得到的结果恰好是按字典序排序,而字典序又恰好是数字从0-9的顺序,恰好符合这个要求.最后进行检验下,有的可能需要调换下顺序使得数最小. package com.cn.qunar.test; /** * @author 刘利娟 [email protected] * @

新浪笔试题之删除文本中词频最小的所有字符串

时间:2014.06.04 地点:基地二楼 -------------------------------------------------------------------------------- 一.题目 题目大概是这样纸的,一个文本文件,里面有好多字符串,要求删除在整个文本中出现频率最少的字符串,如果这个最小值对应的字符串有很多,则都删除,结果是输出一个文本,保留下来的字符串用 '\t' 符号分割. ------------------------------------------

笔试题:排序后取最小差值数

笔试题:要从5个人中选取2个人作为礼仪,其中每个人的身高范围为160-190,要求2个人的身高差值最小(如果差值相同的话,选取其中最高的两人),以升序输出两个人的身高. Smple input:161 189 167 172 188 Sample outPut: 188 189 public class demo06{ public static void main(String[] args){ int[] arr={161,189,167,172,188};//原始值 //将原始值升序排序

班上一个哥们java脑残的笔试题1,2,3,4等于12可以重复3分钟答出来

package com.hao947; public class hao947 { public static void main(String[] args) { int a = 1; int b = 2; int c = 3; int d = 4; int count = 0; for (int i = 0; i <= 12; i++) { for (int j = 0; j <= 6; j++) { for (int k = 0; k <= 4; k++) { for (int l

笔试题学习(dp,重叠子问题,卡特兰数,手电过桥,最长公共子序列)

卡特兰数:https://blog.csdn.net/doc_sgl/article/details/8880468 dp,重叠子问题:https://www.cnblogs.com/hapjin/p/5572483.html 美团2016校招笔试题:https://zhuanlan.zhihu.com/p/29308843 大厂面试经验:https://mp.weixin.qq.com/s?__biz=MzI2OTQxMTM4OQ==&mid=2247484859&idx=1&s

(笔试题)被3和5整除的数的和

题目: 给定一个数n, 求不超过n的所有的能被3或者5整除的数的和.例如: n = 9,答案3 + 6 + 5 + 9 = 23. 思路: 能被3或者5整除的数是哪些? 被3整除的数:3,6,9....[n/3]*3 被5整除的数:5,10,15...[n/5]*5 重复的数(同时被3和5整除的数,即被15整除):15,30...[n/15]*15 于是问题的答案就很明显: 被3或者5整除的数的和=被3整除的数之和+被5整除的数之和-被15整除的数之和 因为求和的数列都是等差数列,运用等差数列求