LOADING

加载过慢请开启缓存 浏览器默认开启

2023/10/23

每日一题(快乐数)+cpp实现求解真值表

第202题. 快乐数

哈希表更像是一个备用方案?貌似都不太需要强制使用

力扣题目链接(opens new window)

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为  1,那么这个数就是快乐数。

如果 n 是快乐数就返回 True ;不是,则返回 False 。

示例:

输入:19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

class Solution {
public:
    bool isHappy(int n) {
        unordered_set<int> uset={n};
        while (n!=1){
            int num=0;
            while (n){
                num+= pow(n%10,2);
                n=n/10;
            }
            if(uset.find(num)!=uset.end()) return false;
            uset.emplace(num);
            n=num;
        }
        return true;
    }
};

鸽了几周的离散数学实验终于写完了,转为后缀表达式真不想写,copy了下,其他自己琢磨的

还有主析/合取范式,存个二维数组遍历下应该就完成了

//
// Created by 徐昊岩 on 2023/10/8.
//
//否定¬替换为!,析取替换为|,合取替换为&,条件替换为-,双条件替换为=
#include "windows.h"
#include "iostream"
#include "vector"
#include "cmath"
#include "stack"
using namespace std;

bool judge(char p, char q){        //判断运算符优先级

    int x = 0;
    int y = 0;
    if(p == '!')
        x = 5;
    else if(p == '&')
        x = 4;
    else if(p == '|')
        x = 3;
    else if(p == '-')
        x = 2;
    else if(p == '=')
        x = 1;
    if(q == '!')
        y = 5;
    else if(q == '&')
        y = 4;
    else if(q == '|')
        y = 3;
    else if(q == '-')
        y = 2;
    else if(q == '=')
        y = 1;

    return x > y;
}

void change(string s,string &output,int &pos,stack<char>& Stack){                          //中缀表达式转后缀表达式
    char c;
    for(int i = 0; i < s.length(); i++)
    {
        if(s[i] >= 'a' && s[i] <= 'z')
            output[++pos] = s[i];
        else
        {
            if(s[i] == '(')            //如果是左括号直接压进去
                Stack.push(s[i]);
            else if(s[i] == ')')       //如果是有括号弹掉左括号之前的所以的运算符
            {
                while(!(Stack.top() == '('))
                {
                    output[++pos] = Stack.top();
                    Stack.pop();
                }
                Stack.pop();          //弹左括号
            }
            else
            {
                if(Stack.empty())     //栈空直接进栈
                    Stack.push(s[i]);
                else                  //非空就比较优先级
                {
                    while(!judge(s[i],Stack.top())) //如果当前复合优先级小于等于栈顶符号的就弹栈
                    {
                        output[++pos] = Stack.top();
                        Stack.pop();
                        if(Stack.empty()) //防止弹空栈
                            break;
                    }
                    Stack.push(s[i]);     //压入当前运算符
                }
            }
        }
    }
    while(!Stack.empty())  //全部处理完之后将栈内剩余的运算符放到表达式里
    {
        if(Stack.top() != '(' && Stack.top() != ')')
        {
            output[++pos] = Stack.top();
        }
        Stack.pop();
    }
}

int caculator(const int num,vector<int> vec_list,string& output,int pos){
    stack<int> stack_cal;
    int tp1,tp2;
    for(int i=0;i<=pos;i++){
        if(output[i] >= 'a' && output[i] <= 'z')
            stack_cal.push(vec_list[output[i]-'a']);  //后缀表达式,只把变量压入堆栈内
        else{
            tp1=stack_cal.top();
            stack_cal.pop();
            tp2=stack_cal.top();
            stack_cal.pop();
            switch (output[i]) {
                case '&':
                    stack_cal.push(tp1 && tp2);
                    break;
                case '|':
                    stack_cal.push(tp1 || tp2);
                    break;
                case '-':
                    stack_cal.push((!tp1) || tp2);
                    break;
                case '=':
                    stack_cal.push(tp1 == tp2);
                    break;
                case '!':
                    stack_cal.push(tp2);
                    stack_cal.push(!tp1);
                    break;
            }
        }
    }
    return stack_cal.top();
}

void vec_list_pr(int num,string& output,int pos){
    vector<int> vec_list(num,1);
    for(int i=0;i< pow(2,num);i++){
        for(int o=0;o<num;o++){
            if(i%(int)pow(2,num-1-o)==0){
                vec_list[o]=!vec_list[o];
            }
        }
        for(int i=0;i<num;i++) cout<<vec_list[i]<<"    ";
        cout<<caculator(num,vec_list,output,pos)<<endl;
    }
}

string IO(int& count,string& input){
    int a[26]={0};
    for(int i=0;i<input.size();i++){
        if(input[i]>='A' && input[i]<='Z'){
            int flag=0;
            for(int o=0;o<count;o++) {
                if(input[i]==a[o]){
                    flag=1;
                    break;
                }
            }
            if(!flag){
                a[count]=input[i];
                count++;
            }
        }
    }
    // 把PQ等字母转换为ab的目的是方便后续映射为一个vector容器的某个下标对应数
    for(int i=0;i<input.size();i++){
        if(input[i]>=65 && input[i]<=90){
            for(int o=0;o<count;o++){
                if (input[i]==a[o]) input[i]=char(97+o);
            }
        }
    }
    return input;
}

int main(){
    system("chcp 65001 > nul");
    int num=0;
    int pos = -1;
    stack<char> Stack;
    string input;
    string output;
    cout<<"运算符替换规则:否定¬替换为!,析取替换为|,合取替换为&,条件替换为-,双条件替换为="<<endl<<"(请使用大写字母表示变量!)"<<endl;
    cin>>input;
    IO(num,input);
    change(input,output,pos,Stack);
    cout<<num<<endl<<input<<endl;
    vec_list_pr(num,output,pos);
}