首页 > 试题广场 >

提取不重复的整数

[编程题]提取不重复的整数
  • 热度指数:519215 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
输入一个 int 型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
保证输入的整数最后一位不是 0 。

数据范围:

输入描述:

输入一个int型整数



输出描述:

按照从右向左的阅读顺序,返回一个不含重复数字的新的整数

示例1

输入

9876673

输出

37689
//有注释可以看。使用哈希表记录重复元素,降低时间复杂度。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

#define BIT 9   // 10的8次方等于9位数

//交换数组中的元素
void swap(char* a, char* b) {
    char temp = *a;
    *a = *b;
    *b = temp;
}

// 逆序字符串
void reverseString(char* buffer, int length) {
    int head = 0, tail = length - 1;
    while (head < tail) {
        swap(&buffer[head], &buffer[tail]);
        head++;
        tail--;
    }
}

// 去除重复元素
void removeDuplicateDigits(char ch[], int len) {
    if (len < 0 || len > 10)
        exit(-1);

    int hash[10] = {0};
    int i = 0, index = 0;
    int num = 0;

    //使用哈希表,标记每一个数组元素,当且仅当出现次数为0时,进行操作,然后哈希值赋值为1.
    for (i = 0; i < len; i++) {
        num = ch[i] - '0'; //拿到字符数字对应的非字符数字。
        if (hash[num] == 0) {
            hash[num] = 1;
            ch[index++] = ch[i];
        }
    }
    ch[index]='\0';
}


int main() {
    int input = 0;
    scanf("%d", &input);

    // 数据范围:1到10的8次方
    if (input < 1 || input > (int)(pow(10, 8))) {
        return -1;
    }

    // 保证输入的整数最后一位不是 0
    if (input % 10 == 0) {
        return -1;
    }

    char buffer[BIT + 1] = "\0";
    sprintf(buffer, "%d", input);
    int length = strlen(buffer);

    //应该在反转字符串之后立马剔除重复元素
    reverseString(buffer, length);

    removeDuplicateDigits(buffer, length);

    printf("%s\n", buffer);

    return 0;
}


发表于 2024-04-13 16:06:17 回复(0)
#include <stdio.h>
int main() {
   int in;
   int arr[10]={0};
   scanf("%d",&in);
   while(in!=0){
       int a=in%10;
       if(arr[a]!=1){
         arr[a]=1;
         printf("%d",a);
       }
       in/=10;
   }
    return 0;
}
编辑于 2024-02-14 16:43:39 回复(0)
搞嵌入式的平时根本不用这花里胡哨的函数。。。不过就算忘记了手撸一个也不难就是耗时间
#include <stdio.h>
#include <string.h>


char InputNumChar[9] = {0};
char TempChar[9] = {0};
int main() {
    scanf("%s",InputNumChar);
    int Length = strlen(InputNumChar);
    for(int i = Length;i >= 0;i--)
    {
        if(strchr(TempChar,InputNumChar[i]) == NULL)
            strncat(TempChar,&InputNumChar[i],1);
    }
    printf("%s",TempChar);
    return 0;
}


编辑于 2024-01-05 16:35:43 回复(0)
#include <stdio.h>

int main() {
    int yu,m, n = 0, b[10] = {0};
    scanf("%d",&m);
    while (m>0) {
        yu = m%10;
        if (b[yu] == 1) {
            m = m/10;
            continue;
        }
        else {
            b[yu] = 1;
            n = n*10+yu;
            m = m/10;
        }
    }
    printf("%d",n);
    return 0;
}

编辑于 2023-12-01 22:22:05 回复(0)
//根据索引数值变化判断是否有重复数字
#include <stdio.h>
int main() {
    int a[9]={0},b,m;
    scanf("%d",&b);
    while(b!=0)
    {
        m=b%10;
        if(a[m]!=1)
        {
            a[m]=1;
            printf("%d",m);
        }
        b/=10;
    }
    return 0;
}
发表于 2023-07-28 01:03:45 回复(2)
#include <stdio.h>

int main() {
    int a, b[8],n=0,m,i;
    scanf("%d",&a);
    while(a != 0){
        m=a%10;
        a=a/10;
        for(i=0;i<n;i++){
            if(m==b[i]){
                break;
            }
        }
        if(i==n){
            b[i]=m;
            n++;
        }
    }
    for(i=0;i<n;i++)printf("%d",b[i]);

    return 0;
}
发表于 2023-07-17 21:34:54 回复(0)
#include <stdio.h>
#include <string.h>

int main() {
    int a, b;
    int s[10]={0};
    scanf("%d",&a);
    while (a) {
        b=a%10;
        if (s[b]==0) {
            printf("%d",b);
        }
        s[b]=1;
        a=a/10;       
    }
    return 0;
}

发表于 2023-07-06 22:55:10 回复(0)
/**  题目:HJ9 提取不重复的整数
  *  思路:用 数组 将 输入数据 逆序存储,然后从前往后遍历,每一个数字都跟所有地址在它前面的值进行比较,存在相同值则跳出比较循环,不存在相同值则记录该数字,最后用秦九韶算法求出应输出的数值
  *  难点:1、理解题目的意思;2、其实这个题目我不赞同用 字符串 类型进行输入输出,但是也不失为做题的一种方法
  */
#include <stdio.h>

int main() {
    int N;
    int array[9];
    int len = 0;
    int num = 0;
    int flag;

    //  输入整数 N ,用数组array[9] 逆序存储 N(比如 N = 123,则 array[9] = {1, 2, 3})
    scanf("%d", &N);
    for(int i = 0; i < 9; i++) {
        if(N > 0) {
            array[i] = N % 10;
            N /= 10;
            len++;
        }
        if(N == 0) {
            break;
        }
    }

    //  记录array[0],然后从第 2 位到第 len-1 位遍历数组 array,与地址比其小的 array[k] 一一比较,立一个 flag 记录是否存在相同数值
    //  存在相同数值则跳出比较循环,不存在相同数值则用 秦九韶算法 num = num * 10 + array[j] 记录数值
    num = num * 10 + array[0];
    for(int j = 1; j < len; j++) {
        flag = 0;
        for(int k = 0; k < j; k++) {
            if(array[j] == array[k]) {
                flag = 1;
                break;
            }
        }
        if(flag == 0) {
            num = num * 10 + array[j];
        }
    }

    printf("%d", num);

    return 0;
}

发表于 2023-03-27 00:55:33 回复(0)
#include <stdio.h>

int main() {
    int num,a;
    int count[10]={0};
    scanf("%d",&num);
    while(num>0)
    {
        a=num%10;
        if(!count[a])
        {
            count[a]=1;
            printf("%d",a);
        }
        num/=10;
    }
    return 0;
}


发表于 2023-03-19 10:34:08 回复(0)
#include <stdio.h>

int main() {
    int num;
    int flag[10][2]={{0,0},{1,0},{2,0},{3,0},{4,0},{5,0},{6,0},{7,0},{8,0},{9,0}};//标志
    int a=0,b[10]={0},i=0;
    scanf("%d",&num);
    while(num>0)
    {
        a=num%10;//获取最后一位
        if(flag[a][1]==0)//判断取出来的数字原来有没有取出来过
        {
            b[i]=a;
            flag[a][1]=1;
            i++;
        }
        num=num/10;
    }
    for(a=0;a<i;a++)
    {
        printf("%d",b[a]);
    }
    return 0;
}

发表于 2023-01-20 14:49:26 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
    
    int input = 0;
    int output = 0;
    int flag[10] = {0};
    scanf("%d", &input);
    if (input/10 == 0){
        printf("%d",input);  //个位
        return 0;
    }
    while(input/10 != 0){  //只要不是个位数 就进行处理
            if(flag[input%10] == 1){  
                input = input/10;  //这个数字重复了
            } else{
                flag[input%10] = 1;  //第一次出现这个数字
                output =output*10 + (input%10);
                input = input/10;
            }
    }
    if(flag[input] == 1){
        printf("%d",output);
    }else {
        printf("%d",output*10+input);
    }

}

发表于 2022-08-23 22:56:14 回复(0)
int main()
{
    int n;
    char s[1000000] = { '\0' };
    int i, len;
    scanf("%d", &n);
    s[0] = n % 10 + '0';
    n = n / 10;
    len = 1;
label:for (i = 0; i < len; i++)
{
    if (s[i] != n % 10 + '0')
        continue;
    else
        break;
}
if (i == len)
{
    s[i] = n % 10 + '0';
    n = n / 10;
    len++;
}
else
n = n / 10;
if (n)
goto label;
puts(s);
return 0;
}

发表于 2022-07-10 19:47:14 回复(0)
发表于 2022-06-29 17:13:17 回复(0)
又臭又长,唉😔
#include<stdio.h>

int main()
{
    int num_x, count, num_t;
    num_x = count = 0;
    scanf("%d", &num_x);
    num_t = num_x;
    while(num_t)
    {
        ++count;
        num_t /= 10;
    }
    int* vate = (int*)malloc(sizeof(int)*count);
    for(int i = 0; i<count; i++)
    {
        vate[i] = num_x %10;
        num_x /= 10;
    }
    for(int j = 0; j<count; j++)
    {
        if(vate[j] == -1)
        {
            continue;
        }
        for(int z = j+1; z<count; z++)
        {
            if(vate[j] == vate[z])
            {
                vate[z] = -1;
            }
        }
        if(vate[j] != -1)
        {
            printf("%d", *(vate+j));
        }
    }
    free(vate);
    vate = NULL;
    return 0;
}


发表于 2022-06-25 21:12:53 回复(0)
#include <stdio.h>

int main()
{
    char recv[65536];
    scanf("%s",recv);
    int len = strlen(recv);
    
    int i=0,j=0;
    int re;
    for(i=len-1;i>=0;i--)
    {
        re = 0;
        for(j=len-1;j>i;j--)
        {
            if(recv[i] == recv[j])
                re = 1;
        }
        if(!re)
            printf("%c",recv[i]);
    }
}
发表于 2022-05-14 20:24:10 回复(0)
#include <stdio.h>

int main() {
   
    int num;
    int flag[10][2] = {{0, 0},{1, 0},{2, 0},{3, 0},{4, 0},{5, 0},{6, 0},{7, 0},{8, 0},{9, 0}};
    scanf("%d",&num);
    int val1;
    int value = 0;
    do{
        val1 = num % 10;
        if (flag[val1][1] == 0) {
            value = value * 10 + val1;
            flag[val1][1] = 1;
        }
        num /=  10;
    }while(val1);
    printf("%d", value/10);
    return 0;
}

发表于 2022-04-20 00:56:12 回复(1)

问题信息

难度:
39条回答 90669浏览

热门推荐

通过挑战的用户

查看代码